Pipes no Linux

Publicado por Ronaldo Meneguite em 12/02/2010

[ Hits: 20.656 ]

Blog: http://www.rlmti.com

 


Pipes no Linux



Abstract: This article discusses about pipe mechanism. Pipe was created by Doug McIlroy, for Unix shell, and was named by analogy to fluid transports pipes. The central idea of pipe is to link a set of processes, in a way that each process' output is the next process's input.

Resumo: Este artigo discorre brevemente sobre o mecanismo de PIPE. Criado pelo professor Doug McIlroy para o shell do Unix, o mecanismo tem seu nome inspirado nos tubos (pipes), de transporte de fluídos. A ideia do PIPE é encadear um conjunto de processos, de modo que a saída de cada um seja a entrada do seguinte.

1. Comunicação entre processos

A comunicação entre processos, do inglês Inter-Process Communication (IPC), é o grupo de mecanismos ao qual permite que processos possam transferir informações entre si.

Para a execução de um processo é pressuposto por parte do sistema operacional, entre outras coisas, a criação de um contexto de execução própria ao qual abstrai os processos dos componentes reais do sistema. Devido a esta "virtualização" dos recursos, o processo não tem conhecimento acerca dos outros processos e, como tal, não consegue trocar informação com os outros processos.

1.1. Pipes

1.1.1 Pipes unidirecionais

Esta é a forma mais divulgada de IPC. O Pipe unidirecional, ou "canalização", é o redirecionamento da saída padrão de um programa para a entrada padrão de outro. É um recurso muito utilizado em sistemas Unix/Linux para tratar entradas e saídas de dados, um recurso muito versátil ao qual permite que seja redirecionado a entrada ou saída padrão de um determinado processo, para um segundo processo.

Um exemplo de uso do pipe no Linux seria:

cat doctum.txt | wc
Linux: Pipes no Linux
Figura 1 - Representação gráfica de uso do PIPE
1.1.1. Pipes nomeados (FIFO)

No contexto da computação, um pipe nomeado (também chamado de named pipe ou FIFO) é uma extensão do conceito de pipe do sistema Unix/Linux e dos seus métodos de comunicação entre processos. O mesmo conceito é encontrado no Microsoft Windows, apesar da sua semântica ser razoavelmente diferente. Um pipe tradicional (anônimo) dura somente o tempo de execução do processo e, por outro lado, o pipe nomeado persiste além da vida do processo e precisa ser "desligado" ou apagado quando não é mais usado. Os processos geralmente se conectam a um pipe nomeado (normalmente um arquivo) quando necessitam realizar alguma comunicação com outro processo (IPC).

1.1.2.1. Pipe nomeado no Unix/Linux

Ao contrário do pipe convencional, não nomeado e de console, um pipe nomeado é criado explicitamente utilizando-se os comandos mknod ou mkfifo. Dois processos podem utilizar este pipe através do seu nome.

Por exemplo, pode-se criar um pipe e instruir o programa gzip para comprimir aquilo que é enviado (piped) para ele.

mkfifo pipe
$ gzip -9 -c < pipe > destino


Independentemente, em um processo separado, pode-se executar o comando:

cat origem > pipe

Esse comando comprimirá os dados do arquivo "origem" em um arquivo de nome "destino".

1.1.2.2. Pipe nomeado no Windows

No Windows, o projeto do pipe nomeado foi influenciado pela comunicação cliente-servidor e, por isso, eles se parecem muito mais com sockets do que com operações convencionais de escrita e leitura. O Windows suporta um "modo passivo" para aplicações servidoras (comparável com os domain sockets do Unix). O Windows 95 suporta pipes nomeados em modo cliente que, no Windows NT, também podem atuar como servidores.

O pipe nomeado pode ser acessado como um arquivo. As funções CreateFile, ReadFile, WriteFile e CloseHandler, da SDK Win32, podem ser utilizadas para abrir, ler, escrever e fechar um pipe. As funções da biblioteca C, como fopen, também podem ser utilizadas para operações em pipes nomeados, ao contrário do caso dos Windows Sockets, onde a comunicação em rede não foi implementada como operações padrão de I/O em arquivos. Não existe interface de linha de comando como nos sistemas Unix.

O pipe nomeado não é permanente e não pode ser criado como um arquivo especial em sistemas de arquivo que permitam escrita, como no Unix. O pipe é volátil (é liberado após a última referência para ele ser fechada), é alocado na raiz do named pipe filesystem (NPFS) e é montado através do caminho especial \\. \pipe\ (isto é, um pipe nomeado como "foo" deve ter um nome de caminho de \\.\pipe\foo). O pipe anônimo dos comandos de pipeline é na realidade um pipe nomeado com um nome aleatório.

1.1.2.3. Pipe nomeado numa rede Windows

O pipe nomeado também é utilizado como protocolo de rede da suíte Server Message Block (SMB). O IPC do SMB pode passar o contexto de autenticação do usuário de maneira transparente através de pipes nomeados. Toda a suíte de serviços de um domínio do Windows NT é implementada através de pipes nomeados.

2. Conclusão

O Pipe é um mecanismo de extrema importância na comunicação entre processos, possibilitando que o processamento se dê de forma simples, flexível e eficiente, com baixo acoplamento e alta coesão.

3. Referências bibliográficas

FEITOSA, Samuel. "Pipes e Pipes Nomeados ou Fifos". Blog de Samuel Feitosa, Jul 2009. http://samuca.wordpress.com/2007/05/02/pipes-e-pipes-nomeados-ou-fifos/. Acesso em: 5 nov 2009

PIPE nomeado. In: Wikipédia: a enciclopédia livre. Disponível em: http://pt.wikipedia.org/wiki/Pipe_nomeado. Acesso em: 5 nov 2009

RIBEIRO, Uirá. Certificação Linux. 1° ed. Axcel Books, 2004.

Outras dicas deste autor

Relatórios do iReport no PHP com PHPJasperXML

Leitura recomendada

Um erro de programação pode matar?

Nikto - Instalação e utilização

Criando chroot no CentOS 6.x

A arquitetura OSI de segurança

Instalação do Jboss no Fedora 8 Linux

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts