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).