2012-01-14 23 views
5
void child(int pid){ 
    printf("Child PID:%d\n",pid); 
    exit(0);  
} 
void parent(int pid){ 
    printf("Parent PID:%d\n",pid); 
    exit(0); 
} 

void init(){ 
    printf("Init\n");//runs before the fork 
} 


int main(){ 

    init();//only runs for parent i.e. runs once 
    printf("pre fork()");// but this runs for both i.e. runs twice 
    //why??? 

    int pid = fork(); 

    if(pid == 0){ 
     child(pid); //run child process 
    }else{ 
     parent(pid);//run parent process 
    } 
    return 0; 
} 

de salida:Llamada al sistema Unix fork() ¿qué se ejecuta cuando?

Init 
pre fork()Parrent PID:4788 
pre fork()Child PID:0 

tengo un proceso en un sistema operativo Unix (Ubuntu en mi caso). No puedo por mi vida entender cómo funciona esto. Sé que la función fork() divide mis programas en dos procesos, pero ¿desde dónde? ¿Crea un nuevo proceso y ejecuta de nuevo toda la función principal y, de ser así, por qué el init() solo se ejecutó una vez y el printf() dos veces?

¿Por qué el printf("pre fork()"); funciona dos veces y el init() funciona solo una vez?

Respuesta

22

Solo hay un proceso hasta la horquilla. Es decir, ese camino se ejecuta solo una vez. Después de la bifurcación hay 2 procesos, por lo que el código que sigue a esa llamada al sistema es ejecutado por ambos procesos. Lo que ignora es que ambos terminan y ambos llamarán al exit.

En su código no está vaciando stdio. Entonces, ambos procesos hacen eso (salga de búferes de stdio de flushes): es por eso que está viendo esa salida.

Prueba esto:

printf("pre fork()\n"); 
        ^^ should flush stdout 

o tal vez

printf("pre fork()\n"); 
fflush(stdout); 
+0

muchas gracias. realmente útil: D – boogie666

+0

¡Guau, esto es tan sutil! +1 de mi parte –

+2

Simplemente colocar una nueva línea no necesariamente limpia el búfer. Ejecute el código con stdout redirigido a un archivo normal y verá exactamente el mismo comportamiento. stdout es * no * línea almacenada de forma predeterminada a menos que sea un tty. –

Cuestiones relacionadas