next up previous
Next: Aplicações das primitivas de Up: Os tubos ou pipes Previous: A Primitiva pipe()

Segurança do sistema

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.


next up previous
Next: Aplicações das primitivas de Up: Os tubos ou pipes Previous: A Primitiva pipe()
Celso Alberto Saibel Santos 2000-11-14