2010-11-17 20 views

Respuesta

6

Si lee, compila y ejecuta el siguiente programa, debe tener una mejor idea de lo que está sucediendo.

#include <stdio.h> 
#include <unistd.h> 

int main(void) { 
    pid_t fk; 

    printf("\tbefore fork my pid = %lu\n", (unsigned long)getpid()); 

    fflush(stdout); /* This may keep the above print 
         statement from outputing twice. */ 

    fk = fork(); /* The OS kernel makes a copy of the current process here */ 

    printf("fork returned %lu and now my pid = %lu\n", 
         (unsigned long)fk, (unsigned long)getpid()); 

    return 0; 
} 

La razón por la que se necesita la fflush(stdout) es que, dado que el proceso se duplica por el tenedor que significa que el búfer hecho por la salida estándar por stdio se duplica también. La "\ n" al final de la primera declaración de impresión puede hacer que siga adelante y eliminar stdout, pero esto no está garantizado.

18

La función de bifurcación devuelve 0 en el proceso hijo que se creó y devuelve la ID del hijo al proceso principal.

Cada uno de los dos procesos tiene un único valor.

Por lo tanto, piense en ello más como una devolución llamada en cada proceso de la rosca.

+7

Una devolución para cada proceso, no hilo. –

5

fork no devuelve dos valores. Inmediatamente después de una llamada al sistema fork, simplemente tiene dos procesos independientes ejecutando el mismo código, y el pid devuelto desde fork es la única forma de distinguir en qué proceso se encuentra: el padre o el hijo.

12

Como Gnostus dice, la función tenedor() no devuelve dos valores.

Lo que hace es devolver un solo valor, como lo hacen todas las funciones, pero vuelve dos veces.

Una vez dentro del proceso principal y una vez dentro del elemento secundario. El proceso principal obtiene la ID de proceso del niño devuelta, el niño obtiene 0, una identificación de proceso no válida, por lo que el código puede indicar que es el hijo.

El elemento secundario es un proceso nuevo, ejecuta el mismo código y está en el mismo lugar en el código que el elemento primario que lo generó.

int cProcessID; 

cProcessID = fork(); 

if (cProcessID == 0) { 
    // Child process 
} else { 
    // Parent process 
} 
6

La idea clave es pensar en el hecho de que después de fork() tiene realmente dos copias de de su programa. Estos son dos procesos, que ejecutan la misma copia exacta de su código, y el puntero de ejecución está exactamente en la misma línea de código, es decir, fork(), listo para regresar.

El sistema operativo organiza el fork() para devolver en el proceso principal con el pid del hijo, y para que regrese en el proceso secundario con cero (si las cosas van bien).

Es por eso que dicen que fork() regresa dos veces. Una vez en cada proceso.

Cuestiones relacionadas