Pipe

Comunicação entre processos

  • Seja bem-vindo!

O objetivo deste site é explicar de forma simplicada como funciona o Pipe, canal de comunicação entre processos.

  • O que é Pipe?

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).

  • Código

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.