Os pipes nomeados (fifo) têm quatro três vantagens em que consigo pensar:
- você não precisa iniciar os processos de leitura / escrita ao mesmo tempo
- você pode ter vários leitores / escritores que não precisam de ancestralidade comum
- como um arquivo, você pode controlar a propriedade e as permissões
-
eles são tubos bidirecionais, sem nome, podem ser unidirecionais**) Think of a standard shell
|
pipeline which is unidirectional, several shells (ksh
,zsh
, andbash
) also offer coprocesses which allow bi-directional communication. POSIX treats pipes as half-duplex (i.e. each side can only read or write), thepipe()
system call returns two file handles and you may be required to treat one as read-only and the other as write-only. Some (BSD) systems support read and write simultaneously (not forbidden by POSIX), on others you would need two pipes, one for each direction. Check yourpipe()
,popen()
and possiblypopen2()
man pages. The undirectionality may not be dependent on whether the pipe is named or not, though on Linux 2.6 it is dependent.
(Atualizado, graças ao feedback de Stephane Chazelas )
Portanto, uma tarefa imediatamente óbvia que você não pode alcançar com um pipe sem nome é uma aplicação cliente / servidor convencional.
O último ponto (acima) sobre os canais unidirecionais é relevante no Linux, POSIX (veja popen()
diz que um pipe precisa ser apenas legível ou gravável , em Linux eles são unidirecionais . Veja Entendendo o Kernel do Linux (3ª Ed. O'Reilly) para detalhes específicos do Linux (p787). Outros sistemas operacionais oferecem canais bidirecionais (sem nome).
Como exemplo, o Nagios usa um fifo para seu arquivo de comando . Vários processos externos (scripts CGI, verificações externas, NRPE, etc) escrevem comandos / atualizações para este fifo e estes são processados pelo persistente processo Nagios.
Os pipes nomeados possuem recursos não diferentes das conexões TCP, mas existem diferenças importantes. Como um fifo tem um nome de sistema de arquivos persistente, você pode escrever nele mesmo quando não há leitor, reconhecidamente as gravações irão bloquear (sem E / S assíncrona ou sem bloqueio), embora você não perca dados se o receptor não estiver iniciado (ou está sendo reiniciado).
Para referência, veja também soquetes de domínio Unix , e a resposta para esta questão do Stackoverflow que resume a IPC principal métodos e este que fala sobre popen()