2013-04-18 3 views
7

stavo correndo il programmaPerché getppid() dal ritorno bambino 1

#include<stdio.h> 
#include <unistd.h> 
main() 
{ 
    pid_t pid, ppid; 
    printf("Hello World1\n"); 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("I am the child\n"); 
     printf("The PID of child is %d\n",getpid()); 
     printf("The PID of parent of child is %d\n",getppid()); 
    } 
    else 
    { 
     printf("I am the parent\n"); 
     printf("The PID of parent is %d\n",getpid()); 
     printf("The PID of parent of parent is %d\n",getppid());   
    } 
} 

l'uscita ho ottenuto è stato.

$ ./a.out 
Hello World1 
I am the parent 
The PID of parent is 3071 
The PID of parent of parent is 2456 
I am the child 
The PID of child is 3072 
The PID of parent of child is 1 

non potevo capire la linea di

il PID del genitore del bambino è 1

avrebbe dovuto essere 3071?

+0

Si osserverà il comportamento che ci si aspetta aggiungendo appropriato 'fflush (NULL);' (prima di 'fork') e' sleep (1); 'chiama (in entrambe la parte then e else di' if', e poco prima della fine di 'main'). –

risposta

12

Poiché il processo genitore è terminato dal momento in cui il bambino richiede il pid del genitore.

Quando un processo termina, tutti i suoi figli vengono riassegnati come figli del processo init, che è PID 1.

Prova utilizzando wait() nel codice del genitore di attendere per il bambino da eseguire. Dovrebbe quindi funzionare come ci si aspetta.

0

pid 1 è per processo di inizializzazione e sembra che il processo genitore sia terminato prima che il bambino possa stampare.

Se si modifica la parte altra cosa in questo modo: -

else 
    { 
     printf("I am the parent\n"); 
     printf("The PID of parent is %d\n",getpid()); 
     printf("The PID of parent of parent is %d\n",getppid()); 
     while(1); 
    } 

si dovrebbe vedere l'uscita giusta.