Comprensión de Fork en C

Tengo un problema con el tenedor que no entiendo.

#include  #include  main(){ printf("test 1.\n"); fork(); printf("test 2.\n"); } 

la salida es:

prueba 1
prueba 2
prueba 1
prueba 2

¿No debería estar recibiendo …:
prueba1
prueba2
prueba2

Realmente no entiendo esto porque fork debería crear un proceso hijo después de fork (); y no imprimiendo el teste1 de nuevo.

Cuando llama a printf , no imprime ningún texto inmediatamente. En su lugar, espera hasta que hayas impreso mucho texto, o llames a fflush(stdout) , o el progtwig se cierre. (Editar: también hay otras cosas que harán que se imprima el texto almacenado)

Cuando el proceso se bifurca, copia el búfer del texto no impreso (que contiene “prueba 1. \ n”). Ambos procesos luego imprimen “prueba 1. \ n” cuando salen.

Llamar a fflush(stdout) antes de fork() corrige esto, asegurándose de que “prueba 1. \ n” esté realmente impresa antes de que el proceso se bifurque.

prueba esto:

 void exit_message (void) { // use write to have an unbuffered output char m[100]; sprintf (m, "%d exit\n", getpid()); write (1, m, strlen(m)); } main(){ atexit (exit_message); printf("%d test 1\n",getpid()); fork(); printf("%d test 2\n",getpid()); } 

La salida se verá así:

 14866 exit // <- parent process flushes its output at exit 14866 test 1 // <- parent process: 1st printf 14866 test 2 // <- parent process: 2nd printf 14867 exit // <- forked process flushes its output at exit 14866 test 1 // <- forked process: unflushed parent process output buffer 14867 test 2 // <- forked process: 2nd printf 

Podemos ver que la única impresión realizada por el proceso bifurcado es la última, como se esperaba.

La línea anterior es un fantasma del búfer de salida stdout, que ha sido duplicado por fork () antes de ser vaciado.

Haciendo stdout sin búfer

 main(){ atexit (exit_message); setvbuf(stdout, NULL, _IONBF, 0); printf("%d test 1\n",getpid()); fork(); printf("%d test 2\n",getpid()); } 

se deshace del fantasma

 14866 test 1 // <- parent process: 1st printf 14866 test 2 // <- parent process: 2nd printf 14866 exit // <- parent process exits 14867 test 2 // <- forked process: 2nd printf 14867 exit // <- forked process exits