/* 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); } }