Conhecendo Pipe e FIFO (parte final)

Conhecendo Pipe e FIFO (parte final)

16/03/2015 Marcos Paulo de Souza 3 min de leitura

Esta é a última parte desta série de postagens que têm como foco explicar o funcionamento básicos de pipes e fifos no Linux. Se você não viu as primeiras duas partes, clique aqui e aqui.

Nesta postagem será explicado o funcionamento do fifo. Fifos funcionam da mesma forma que os pipes. Sua única diferença é que eles são criados no sistema de arquivos. Por serem objetos de um sistema de arquivo, o fifo deve ter um nome por onde deve ser acessado. Por esta razão o fifo é também comumente chamado de named pipe. Como o fifo se trata de um arquivo, isso permite que processos não afiliados podem utilizar o canal para trocar informações. Isto não era permitido com a utilização dos pipes, pois o fifo existia somente no contexto dos processos criados a partir do processo que criava o pipe.

Segue abaixo a verificação de um arquivo fifo no sistema de arquivos:


[[email protected] ~]$ ls -l meu_fifo
prw-rw-r-- 1 marcos marcos 0 Mar  7 14:25 meu_fifo
[[email protected] ~]$ file meu_fifo
meu_fifo: fifo (named pipe)

Podemos ver na execução do comando ls a letra p no início máscara de permissões do arquivo. Esta letra nos informa que o arquivo em questão se trata de um fifo. E ainda, executando o comando file podemos constatar o nome named pipe para o fifo.

A seguir serão mostrados dois programas, um que irá ler os dados enviados ao fifo, e outro que escreverá no fifo. Leitura:

Explicações sobre o código: Nesta parte, é verificada a existência do arquivo meu_fifo com a chamada stat. Se esta falhar, significa que o arquivo não existe, ou que não temos permissão para ler o arquivo. Se não existir o arquivo, a chamada mkfifo cria o fifo. Esta chamada recebe um caminho, e uma máscara para a criação do arquivo. Esta máscara é a mesma que utilizada na criação de arquivos simples.

O resto do código trata de operações normais de IO. O fifo é aberto para leitura, e a cada chamada read, ele fica bloqueado até ter dados. Quando existirem dados, estes são impressos no console. Se a chamada read retornar zero, significa que o lado que escreve no fifo fechou seu file descriptor. Este mesmo comportamento ocorre com sockets: quando um dos lados fecha o seu fd, o outro lado recebe zero na chamada read, sinalizando o fim da troca de dados.

Segue agora o código do programa que escreverá no fifo: Na parte de escrita, o programa em si é bem simples: Verifica a existência do fifo, abre o fifo como escrita, espera por entradas do usuário e as envia para o fifo.

Para compilar os programas, execute: gcc ler.c -o ler gcc escrever.c -o escrever

Segue abaixo os programas sendo executados: [[email protected] fifo]$ ./ler & [1] 11884 fifo meu_fifo previamente criado [[email protected] fifo]$ ./escrever Teste Lido: Teste Novo Teste Lido: Novo Teste fifo Lido: fifo

Espero que tenham gostado desta sequência de artigos. Se houverem comentários ou dúvidas, coloquem estas nos comentários. Não se esqueça de se inscrever em nossas redes sociais. Até mais!

Referências: fifo mkfifo pipe stat