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

47

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

Eu pesquisei no tópico; até certo ponto consegui entendê-lo: - pipes nomeados || FIFO

Mas ainda sinto que estou sem o conhecimento de quando usar esse tipo específico de tubo. Há alguma situação especial em que os pipes não nomeados não funcionem?

    
por Ankit 25.03.2013 / 11:10

4 respostas

36

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, and bash) also offer coprocesses which allow bi-directional communication. POSIX treats pipes as half-duplex (i.e. each side can only read or write), the pipe() 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 your pipe(), popen() and possibly popen2() 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()

    
por 25.03.2013 / 12:15
14

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

Os pipes nomeados são, na verdade, FIFO. Estes são objetos persistentes representados por nós no sistema de arquivos. Um pipe nomeado fornece comunicação de muitos para muitos, de duas vias, 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 pipe serve como um endereço ou contrato entre os processos de comunicação. Se apenas um processo gravar em um pipe nomeado e um outro processo for lido a partir do 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 talvez não existam ao mesmo tempo.

    
por 25.03.2013 / 12:15
4

Uma vantagem não mencionada em outro lugar é que um pipe nomeado pode ser usado em locais onde somente 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 e-mail pudesse perceber que a assinatura é executável e executada, você não precisaria de 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 toda vez que o arquivo for lido.

    
por 15.11.2013 / 11:09
3

Existe 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 você sairá. É consideravelmente mais fácil do que transformar uma aplicação projetada para trabalhar em arquivos em um serviço escutando em uma porta.

    
por 15.11.2013 / 11:38

Tags