Quais são as vantagens de usar pipe nomeado em vez de pipe não nomeado?

51

Eu estava revisando um conjunto de perguntas da entrevista feitas por um administrador unix; Encontrei um tópico chamado "pipe nomeado".

Eu pesquisei no tópico; até certo ponto, consegui entender: - pipes nomeados || FIFO

Mas ainda sinto que não tenho conhecimento de quando usar esse tipo específico de tubo. Existem situações especiais em que pipes não nomeados deixariam de funcionar?

Ankit
fonte

Respostas:

39

Os pipes nomeados (fifo) têm quatro três vantagens em que consigo pensar:

  • você não precisa iniciar os processos de leitura / gravação ao mesmo tempo
  • você pode ter vários leitores / escritores que não precisam de ascendência comum
  • como um arquivo, você pode controlar a propriedade e as permissões
  • eles são bidirecionais, tubos sem nome podem ser unidirecionais *

    *) Pense em um shell padrão |gasoduto que é unidirecional, várias conchas ( ksh, zshe bash) também oferecem coprocesses que permitem a comunicação bi-direcional. O POSIX trata os pipes como half-duplex (ou seja, cada lado pode apenas ler ou gravar), a pipe()chamada do sistema retorna dois identificadores de arquivo e pode ser necessário tratar um como somente leitura e o outro como somente gravação. Alguns sistemas (BSD) suportam leitura e gravação simultaneamente (não é proibido pelo POSIX); em outros, você precisaria de dois tubos, um para cada direção. Verifique suas e pipe(), popen()possivelmente popen2(), páginas de manual. A falta de direção pode não depender de se o pipe é nomeado ou não, embora no Linux 2.6 seja dependente.

(Atualizado, graças aos comentários de Stephane Chazelas )

Portanto, uma tarefa imediatamente óbvia que você não pode realizar com um canal sem nome é um aplicativo cliente / servidor convencional.

O último ponto (afetado) acima sobre os tubos unidirecionais é relevante no Linux, o POSIX (consulte popen()) diz que um tubo só precisa ser legível ou gravável , no Linux eles são unidirecionais . Consulte Noções básicas sobre o kernel do Linux (3ª Ed. O'Reilly) para obter detalhes específicos do Linux (p787). Outros sistemas operacionais oferecem tubos 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 artigo e são processados ​​pelo processo persistente do Nagios.

Os pipes nomeados possuem recursos não muito diferentes das conexões TCP, mas existem diferenças importantes. Como um fifo tem um nome de sistema de arquivos persistente, você pode gravá-lo mesmo quando não há leitor, é certo que as gravações serão bloqueadas (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, ver também tomadas Unix domínio , e a resposta a esta questão Stackoverflow que resume as principais IPC métodos, e esta uma que fala sobrepopen()

mr.spuratic
fonte
2
você também pode ter vários leitores / gravadores com pipes sem nome. No Linux, eles não são mais bidirecionais que o pipe sem nome. Há um final de gravação e um final de leitura e os dados fluem em apenas uma direção. Quando você abre um fifo no modo de gravação, obtém o final da gravação, no modo de leitura o final da leitura, no modo rw, você grava no final da gravação e lê a partir da leitura. Isso é diferente de pipes bidirecionais ou soquetes de domínio unix, onde você realmente tem dois fluxos de dados separados em cada direção.
Stéphane Chazelas 25/03
@StephaneChazelas obrigado pelo feedback, atualizei a resposta para ser mais específico e esclareço (espero) os tubos e a direcionalidade.
mr.spuratic
A comunicação com um pipe nomeado envolve E / S de disco? Ou está tudo na memória? O que determina o envelope de desempenho desses mecanismos do IPC?
CMCDragonkai
15

Os pipes anônimos ou anônimos fornecem um meio de comunicação interprocessual unidirecional entre processos diferentes relacionados por um relacionamento pai-filho ou por serem filhos de um pai comum que fornece o canal, como um shell processo. Como os processos estão relacionados, a associação dos descritores de arquivo ao canal pode estar implícita e não requer um objeto com um nome externo aos processos. Um canal sem nome existe apenas enquanto as processadas que o utilizam mantêm descritores de arquivo abertos no canal. Quando os processos saem e o sistema operacional fecha todos os descritores de arquivo associados aos processos, o canal sem nome é fechado.

Os pipes nomeados são de fato FIFO. Esses são objetos persistentes representados por nós no sistema de arquivos. Um canal nomeado fornece comunicação bidirecional de muitos para muitos entre um ou mais processos que não estão necessariamente relacionados e não precisam existir ao mesmo tempo. O nome do arquivo do canal serve como um endereço ou contrato entre os processos de comunicação. Se apenas um processo gravar em um pipe nomeado e outro processo ler no pipe nomeado, o pipe nomeado se comportará da mesma maneira que um pipe não nomeado entre os dois processos relacionados.

Portanto, a resposta curta é que você precisa de um canal nomeado para comunicação entre processos não relacionados que podem não existir ao mesmo tempo.

Jonathan Ben-Avraham
fonte
+1 Acho que os processos quase sempre existem ao mesmo tempo (caso contrário, o pipe é um pouco inútil - é melhor deixar as coisas em um arquivo regular). Esses soquetes de domínio e unix são frequentemente usados ​​por serviços daemon que podem ser controlados, por exemplo, na linha de comando. Se você procurar em /runum sistema desktop Linux, provavelmente encontrará alguns de ambos (chamados de soquetes fifos e unix). É uma forma de IPC .
Goldilocks
2
@goldilocks: um pipe nomeado é comumente usado como uma caixa de correio ad-hoc residente na memória entre processos em sistemas embarcados, onde os processos de comunicação são de curta duração e não existem ao mesmo tempo. A vantagem é a simplicidade da implementação versus IPC de memória compartilhada e o fato de que apenas a RAM é usada. A desvantagem é a não persistência entre as botas e a natureza FIFO em bytes do pipe versus a capacidade de usar uma estrutura com memória compartilhada.
Jonathan Ben-Avraham
@ Jonathan: +1, tenho algumas dúvidas: - por que nos referimos a pipes nomeados como FIFO; o que são objetos persistentes?
Ankit
@ Ankit: Algumas pessoas chamam um pipe nomeado de FIFO porque ele se comporta como uma estrutura de dados FIFO, especialmente quando aberto para leitura e gravação por um único processo. Por "objeto persistente", quis dizer que um pipe nomeado está associado a um objeto do sistema de arquivos. Ou seja, é um tipo de arquivo, com um nome, e tem a mesma persistência que qualquer outro arquivo armazenado na mídia.
Jonathan Ben-Avraham
4

Uma vantagem não mencionada em outro lugar é que um pipe nomeado pode ser usado em locais onde apenas um arquivo funcionará.

Por exemplo, alguns clientes de email têm o recurso de anexar o conteúdo de ~ / .signature a cada mensagem de email. Se .signature fosse uma opção de linha de comando ou se o cliente de email pudesse perceber que .signature é executável e executá-lo, não seria necessário um pipe nomeado. Mas se o cliente de email não é tão sofisticado, você pode criar um pipe nomeado chamado .signature e executar um aplicativo que gere uma nova assinatura sempre que o arquivo for lido.

Eyal
fonte
Interessante. Você tem esse aplicativo? Parece que teria que assistir no nível do kernel para ver quando o FIFO estava sendo acessado.
Curinga
4

Há outra vantagem dos pipes nomeados: você pode usá-los em diferentes sistemas . Suponha que você queira a comunicação em tempo real de dois processos em execução em máquinas diferentes. Em seguida, compartilhe uma pasta entre os dois, coloque seu FIFO na pasta e pronto. É consideravelmente mais fácil do que transformar um aplicativo projetado para trabalhar em arquivos em um serviço escutando em uma porta.

MariusMatutiae
fonte