2010-03-09 24 views
6
void main() 
{ 
    if (fork()) 
    { 
     printf ("PID1 %d\n", getpid()); 
    } 
    else 
    { 
     printf ("PID2 %d\n", getpid()); 
    } 
} 

¿Qué hace este código? Sé que tiene algo que ver con las ID de proceso, pero ¿no debería cambiar algo en la condición para determinar si se trata de un proceso hijo/padre?c - tenedor() código

+5

¿Necesita la etiqueta 'homework'? –

Respuesta

16

lo general, es:

pid_t pid = fork(); 
if(pid == 0) { 
    //child 
} else if(pid > 0) { 
    //parent 
} else { 
//error 
} 

La página del manual dice:

RETURN VALUE 
    Upon successful completion, fork() shall return 0 to the child 
    process and shall return the process ID of the child process to the 
    parent process. Both processes shall continue to execute from 
    the fork() function. 
    Otherwise, -1 shall be returned to the parent process, no child process 
    shall be created, and errno shall be set to indicate the error. 
+0

Ahh ok gracias. Edit: Sí, veo muchos ejemplos como ese también, de ahí que me confundí. – tm1

+0

if (fork()) // si fork exitoso ...................... printf ("PID1% d \ n", getpid()); // print parentID ...................... else printf ("PID2% d \ n", getpid()); // imprimir identificación de niño – tm1

+0

¿Es eso correcto? Lo siento, no sé las etiquetas de código. – tm1

-2

El valor de retorno de tenedor() indica si el proceso es el padre o el niño. Entonces, el niño siempre imprimirá "PID2 0", porque si fork() devuelve 0, se ejecutará la segunda parte de la instrucción if.

+1

does 'getpid()' devuelve el PID real del proceso actual sin importar qué 'fork()' devuelve? –

+0

@SF: suena bien para mí. –

3

El código anterior crea un nuevo proceso cuando ejecuta la llamada de la bifurcación, este proceso será una copia casi exacta del proceso original. Ambos procesos continuarán ejecutando sepotratly en la forma de retorno, la llamada tenedor que plantea la pregunta "¿Cómo sé si soy el nuevo proceso o el anterior?" ya que son casi idénticos. Para hacer esto, los diseñadores de horquillas hicieron que el tenedor devolviera diferentes cosas en cada proceso, en el nuevo proceso (el niño) el tenedor devuelve 0 y el teletipo del proceso original (el padre) devuelve el ID del nuevo proceso para que el padre pueda interactuar con eso

Por lo tanto, en el código, la llamada de fork crea un proceso hijo, ambos procesos realizan la sentencia if de forma independiente. En el elemento primario, el valor de retorno no es cero, por lo que el padre ejecuta la instrucción if. En el niño, el valor de retorno es 0, por lo que hace la declaración else. Espero que esto ayude :-)