Alterar o tamanho do buffer do pipe nomeado

3

Ouvi dizer que, para pipes nomeados, as gravações menores que 512 bytes são atômicas (as gravações não serão intercaladas).

Existe uma maneira de aumentar esse valor para um pipe nomeado específico?

algo como:

mkfifo mynamedpipe --buf=2500

Supostamente esta é a documentação completa: link

man mkfifo me leva a essa página.

    
por Alexander Mills 22.04.2018 / 01:08

1 resposta

1

Um arquivo fifo é apenas um tipo de arquivo que, quando aberto para leitura e gravação, instancia um canal como uma chamada de sistema pipe ().

No Linux, pelo menos, os dados que transitam por esse pipe não são armazenados no sistema de arquivos (somente no kernel como memória do kernel). E o atributo tamanho do arquivo fifo não é relevante e é sempre 0.

No Linux, você pode alterar o tamanho de um buffer de pipe (se esse pipe foi instanciado com pipe() ou abrindo um arquivo fifo) com o F_SETPIPE_SZ fcntl() , embora para usuários não privilegiados, que está vinculado %código%. Qualquer um dos autores ou leitores do pipe pode emitir esse /proc/sys/fs/pipe-max-size , embora faça mais sentido para o escritor fazê-lo. No caso de um pipe nomeado, você precisaria fazer isso para cada pipe instanciado através do arquivo fifo.

$ mkfifo fifo
$ exec 3<> fifo # instantiate the pipe
$ seq 20000 > fifo
^C  # seq hangs because it's trying to write more than 64KiB
$ exec 3<&- 3<> fifo # close the first pipe and instantiate a new one
$ (perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576)'; seq 20000) > fifo
$ # went through this time

Acima, usei fcntl() para emitir o perl , codificando o valor de fcntl() (1031 no meu sistema).

    
por 23.04.2018 / 11:44

Tags