De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Bash - Named pipe
Colaboração: Julio Cezar Neves
Data de Publicação: 21 de Fevereiro de 2005
Um outro tipo de pipe é o named pipe, que também é chamado de
FIFO. FIFO é um acrônimo de "First In First Out" que se refere
à propriedade em que a ordem dos bytes entrando no pipe é a
mesma que a da saída. O name em named pipe é, na verdade, o
nome de um arquivo. Os arquivos tipo named pipes são exibidos
pelo comando ls
como qualquer outro, com poucas diferenças:
$ ls -l fifo1
prw-r-r-- 1 julio dipao 0 Jan 22 23:11 fifo1|
o p
na coluna mais à esquerda indica que fifo1
é um named
pipe. O resto dos bits de controle de permissões, quem pode
ler ou gravar o pipe, funcionam como um arquivo normal. Nos
sistemas mais modernos uma barra vertical (|
) colocada ao fim
do nome do arquivo, é outra dica, e nos sistemas LINUX, onde
a opção de cor está habilitada, o nome do arquivo é escrito
em vermelho por default.
Nos sistemas mais antigos, os named pipes são criados pelo
programa mknod
, normalmente situado no diretório /etc
. Nos
sistemas mais modernos, a mesma tarefa é feita pelo mkfifo
. O
programa mkfifo
recebe um ou mais nomes como argumento e cria
pipes com estes nomes. Por exemplo, para criar um named pipe
com o nome pipe1
, faça:
$ mkfifo pipe1
Exemplo:
Como sempre, a melhor forma de mostrar como algo funciona
é dando exemplos. Suponha que nós tenhamos criado o named pipe
mostrado anteriormente. Em outra sessão ou uma console
virtual, faça:
$ ls -l > pipe1
e em outra, faça:
$ cat < pipe1
Voilá! A saída do comando executado na primeira console
foi exibida na segunda. Note que a ordem em que os comandos
ocorreram não importa.
Se você prestou atenção, reparou que o primeiro comando
executado, parecia ter "pendurado". Isto acontece porque
a outra ponta do pipe ainda não estava conectada, e então o
kernel suspendeu o primeiro processo até que o segundo "abrisse"
o pipe. Para que um processo que usa pipe não fique em modo de
wait, é necessário que em uma ponta do pipe tenha um processo
"tagarela" e na outra um "ouvinte".
Uma aplicação muito útil dos named pipes é permitir que
programas sem nenhuma relação possam se comunicar entre si.
Os named pipes também são usados para sincronizar processos,
já que em um determinado ponto você pode colocar um processo
para "ouvir" ou para "falar" em um determinado named pipe e ele
daí só sairá, se outro processo "falar" ou "ouvir" aquele pipe.