No caso em que todos os descritores associados aos processos susceptíveis de ler num tubo estiverem fechados, um processo que tenta escrever neste tubo deve receber um sinal SIGPIPE, sendo então interrompido se ele não possuir uma rotina de tratamento deste sinal.
Se um tubo está vazio, ou se todos os descritores susceptíveis de escrever sobre ele estiverem fechados, a primitiva read() retornará o valor 0 (fim de arquivo lido).
Exemplo 1: emissão de um sinal SIGPIPE
/* arquivo test_pipe_sig.c */ /* teste de escrita num tubo fechado a leitura */ #include <errno.h> #include <signal.h> #include <unistd.h> #include <stdio.h> void it_sigpipe() { printf("Sinal SIGPIPE recebido \n") ; } int main() { int p_desc[2] ; signal(SIGPIPE,it_sigpipe) ; pipe(p_desc) ; close(p_desc[0]) ; /* fechamento do tubo em leitura */ if (write(p_desc[1],"0",1) == -1) perror("Error write") ; exit(0); }
Resultado da execução:
euler:~/> test_pipe_sig Sinal SIGPIPE recebido Error write: Broken pipe
Neste exemplo, tenta-se escrever num tubo sendo que ele acaba de ser fechado em leitura; o sinal SIGPIPE é emitido e o programa é desviado para a rotina de tratamento deste sinal. No retorno, a primitiva write() retorna -1 e perror imprime na tela a mensagem de erro.
Exemplo 2: Leitura num tubo fechado em escrita.
/* arquivo test_pipe_read.c */ /* teste de leitura num tubo fechado em escrita */ #include <errno.h> #include <signal.h> #include <unistd.h> #include <stdio.h> int main() { int i, p_desc[2] ; char c ; pipe(p_desc) ; /* criacao do tubo */ write(p_desc[1],"AB",2) ; /* escrita de duas letras no tubo */ close(p_desc[1]) ; /* fechamento do tubo em escrita */ /* tentativa de leitura no tuno */ for (i=1; i<=3; i++) { if ( (read(p_desc[0],&c,1) == 0) ) printf("Tubo vazio\n") ; else printf("Valor lido: %c\n",c) ; } exit(0); }
Resultado da execução:
euler:~/> test_pipe_read Valor lido: A Valor lido: B Tubo vazio euler:~/>
Este exemplo mostra que a leitura num tubo é possível, mesmo se este tiver sido fechado para a escrita. Obviamento, quando o tubo estiver vazio, read() vai retornar o valor 0.