next up previous
Next: A primitiva wait() Up: A primitiva fork() Previous: A primitiva fork()

Problema com os buffers de saída:

           /* arquivo test_fork3.c */

/* O filho herda uma copia do buffer de saida do pai */

#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
int pid ;
     printf(" 1") ;
     pid=fork() ;
     if(pid==-1) /* error */
     {
          perror("impossivel de criar um filho") ;
          exit(-1) ;
     }
     else if(pid==0) /* filho */
     {
          printf(" 2") ;
          exit(0) ;
     }
     else /* pai */
     {
          wait(0) ; /* o pai aguarda a morte de seu filho */
          printf(" 3") ;
          exit(0);
     }
}

Resultado da execução:

Contrariamente ao que poderia ser intuitivamente imaginado, o resultado da execução não será

1 2 3

mas

1 2 1 3

Parece estranho... O que teria acontecido? A resposta é que o filho, no seu nascimento, herda o "1" que já estava colocado no buffer de saída do pai (note que nem o caracter de retorno de linha, nem um comando para esvaziar a saída padrão foram enviados antes da criação do filho). Mais tarde, na sua morte, o buffer de saída do filho é esvaziado, e a seguinte saída de impressão será obtida: 1 2. Finalmente, o pai terminará sua execução e imprimirá por sua vez: 1 3.

Uma possível solução para o problema é mostrada no programa a seguir, através da utilização da primitiva fflush, que será detalhada no fim do capítulo.

          /* arquivo test_fork4.c */

/* Solucao para o filho que herda uma copia do buffer nao vazio 
 * de saida do pai */

#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
  int pid ;
     printf(" 1") ;
     fflush(stdout); /* o buffer vai ser esvaziado pelo flush */
     pid=fork() ;
     if(pid==-1) /* error */
     {
          perror("impossivel de criar um filho") ;
          exit(-1) ;
     }
     else if(pid==0) /* filho */
     {
          printf(" 2") ;
          exit(0) ;
     }
     else /* pai */
     {
          wait(0) ; /* o pai aguarda a morte de seu filho */
          printf(" 3") ;
          exit(0);
     }
}



Celso Alberto Saibel Santos 2000-11-14