2013-03-03 15 views
15

Quando eseguo il codice qui sottogetpid e getppid restituire due valori diversi

#include <stdio.h> 
#include <sys/types.h> 
//int i=0; 
int main(){ 

int id ; 
id = fork() ; 
printf("id value : %d\n",id); 
    if (id == 0) 
    { 
    printf ("Child : Hello I am the child process\n"); 
    printf ("Child : Child’s PID: %d\n", getpid()); 
    printf ("Child : Parent’s PID: %d\n", getppid()); 
    } 
    else 
    { 
    printf ("Parent : Hello I am the parent process\n") ; 
    printf ("Parent : Parent’s PID: %d\n", getpid()); 
    printf ("Parent : Child’s PID: %d\n", id); 
    } 

} 

La mia uscita è

id value : 20173 
Parent : Hello I am the parent process 
Parent : Parent’s PID: 20172 
Parent : Child’s PID: 20173 
id value : 0 
Child : Hello I am the child process 
Child : Child’s PID: 20173 
Child : Parent’s PID: 1 

Come può PID del genitore (20172) diverso dal ID del genitore del bambino (1) ? Non dovrebbero quei due essere uguali?

risposta

24

Quello che sta succedendo è che il genitore sta terminando prima dell'esecuzione del bambino. questo lascia il bambino come un orfano e viene adottato dal processo di root con PID di 1. Se si mette un ritardo o si leggono dati da stdin piuttosto che lasciare che il genitore termini, vedrai il risultato che ti aspetti.

processo ID 1 è di solito il processo init principalmente responsabile per l'avviamento e lo spegnimento del sistema. Init (abbreviazione dell'inizializzazione) è un processo daemon che è l'antenato diretto o indiretto di tutti gli altri processi. wiki link for init

Come user314104 sottolinea l'attesa() e waitpid (funzioni) sono progettati per consentire un processo padre di sospendere se stesso fino a quando la condizione di un cambiamento processo figlio. Quindi una chiamata a wait() nel ramo padre dell'istruzione if causerebbe l'attesa del figlio per il genitore.

+1

Oppure, più convenzionalmente, wait() e waitpid(). – user314104

+1

@Jackson ha aggiunto ulteriori informazioni con il collegamento. Sento che è necessario completare la tua buona risposta. se non ti piace tornare indietro. –

0

Poiché il processo padre si esaurisce e viene rilasciato, il processo figlio diventa orfano, init (abbreviazione dell'inizializzazione) il cui pid è 1 ha ricevuto il processo orfano.

Problemi correlati