Pipe
Comunicação entre processos
O objetivo deste site é explicar de forma simplicada como funciona o Pipe, canal de comunicação entre processos.
Os pipes em UNIX constituem um canal de comunicação unidirecional entre processos com um ascendente comum (entre um pai e um seu descendente). Uma vez estabelecido o pipe entre os processos, um deles pode enviar “mensagens” (qualquer sequência de bytes) para o outro. O envio e recebimento destas “mensagens” é feito com os serviços normais de leitura e escrita em ficheiros - read() e write(). Os pipes possuem descritores semelhantes aos dos ficheiros.

Quando se cria um pipe o sistema retorna, para o processo que chamou o serviço de criação, dois descritores que representam o lado de escrita no pipe e o lado de leitura no pipe. Inicialmente esses descritores pertencem ambos a um processo. Quando esse processo lança posteriormente um filho este herdará esses descritores (herda todos os ficheiros abertos) ficando assim pronto o canal de comunicação entre os dois processos. Consoante o sentido de comunicação pretendido deverá fechar-se, em cada processo, um dos lados do pipe (ver a figura seguinte).

A seguir demonstramos um exemplo em que se estabelece um pipe entre os processos pai e filho
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
int main(void)
{
int n, fd[2];
pid_t pid;
char line[MAXLINE];
if (pipe(fd) < 0) {
fprintf(stderr, "pipe error\n");
exit(1);
}
if ( (pid = fork()) < 0) {
fprintf(stderr, "fork error\n");
exit(2);
}
else if (pid > 0) { /* pai */
close(fd[0]); /* fecha lado receptor do pipe */
write(fd[1], "hello world\n", 12);
} else { /* filho */
close(fd[1]); /* fecha lado emissor do pipe */
n = read(fd[0], line, MAXLINE);
write(STDOUT_FILENO, line, n);
}
exit(0);
}
Vídeo
O vídeo a seguir demonstra o funcionamento do código passo a passo.