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:
[marcos@xfiles ~]$ ls -l meu_fifo
prw-rw-r-- 1 marcos marcos 0 Mar 7 14:25 meu_fifo
[marcos@xfiles ~]$ 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: [marcos@xfiles fifo]$ ./ler & [1] 11884 fifo meu_fifo previamente criado [marcos@xfiles 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!