Trabalhos
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).
Funcionamento de pipes
Assim, para criar um pipe num processo deve invocar-se o serviço:
#include
int pipe(int filedes[2]);
Retorna 0 no caso de sucesso e -1 no caso de erro. API do sistema operativo UNIX
Sistemas Operativos - Miguel Pimenta Monteiro 40
Deve passar-se ao serviço pipe() um array de 2 inteiros (filedes) que será preenchido pelo serviço com os valores dos descritores que representam os 2 lados do pipe. O descritor contido em filedes[0] está aberto para leitura - é o lado receptor do pipe. O descritor contido em filedes[1] está aberto para escrita - é o lado emissor do pipe.
Quando um dos lados do pipe está fechado e se tenta uma operação de leitura ou escrita do outro lado, aplicam-se as seguintes regras:
1. Se se tentar ler de um pipe cujo lado emissor tenha sido fechado, após se ter lido tudo o que porventura já tenha sido escrito, o serviço read() retornará o valor