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