Tento criar um pipe nomeado, porém, quando armazeno dados nele, ele ainda fica vazio.
$ mkfifo myfifo
$ cat > myfifo
123
123
123
^[[D
^C
$ ls > myfifo
^C
$ cat < myfifo
(sem saída)
Tento criar um pipe nomeado, porém, quando armazeno dados nele, ele ainda fica vazio.
$ mkfifo myfifo
$ cat > myfifo
123
123
123
^[[D
^C
$ ls > myfifo
^C
$ cat < myfifo
(sem saída)
Você não entendeu como funcionam os pipes nomeados.
De `mkfifo (3)...
Quando você iniciou a gravação e a eliminou antes da operação de leitura, o comando de gravação não funcionou. Ou seja, você só pode escrever nele, quando um leitor estiver anexado.
Se você iniciar outro terminal & run
cat myfifo
, ele irá esperar, imprimir todos os dados gravados no pipe nomeado e, assim que a gravação for concluída, ocat
comando será encerrado.Um pipe requer a existência de dois processos – um escritor e um leitor. (Na verdade, pelo menos dois, pois você pode ter mais de um de cada).
Se você
cat myFifo
estiver em um terminal els > myFifo
em um terminal diferente, verá que os leitores esperam que algo seja escrito. Os escritores podem continuar escrevendo até que o cano se encha e os leitores podem continuar lendo até que o cano se esvazie.Um pipe não é um arquivo; é um mecanismo de comunicação entre processos.
A entrada FIFO que você vê no sistema de arquivos não é o arquivo . A entrada nomeada é o ponto de encontro para estabelecer a comunicação.
Um pipe é criado quando dois descritores de arquivo são abertos no FIFO: um para leitura e outro para escrita. Os descritores de arquivo são conectados para formar um canal, assim como os dois descritores de arquivo que vêm da função POSIX
pipe
C.O mesmo FIFO pode criar muitos tubos; esses tubos são independentes um do outro.
Quando um FIFO é aberto para leitura, a chamada fica bloqueada até que algo abra o FIFO para escrita e vice-versa. É isso que significa encontro: as duas chamadas de abertura encontram-se no FIFO e é criado um tubo unidirecional para elas, unindo-as. Então, tudo o que for escrito na extremidade de gravação do canal poderá ser lido na extremidade de leitura.
Como o FIFO é apenas um ponto de contato, ele não fornece nenhum tipo de armazenamento persistente.
Os próprios pipes possuem uma pequena quantidade de armazenamento temporário mantido na RAM, permitindo que o gravador coloque um certo número de bytes no pipe sem ser bloqueado. Somente o leitor tem acesso a esses bytes. Quando o leitor e o escritor fecham o canal, qualquer conteúdo não lido desaparece.