2013-04-18 4 views
7

ich das Programm ausgeführt wurdeWarum getppid() von dem Kind Rückkehr 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());   
    } 
} 

Der Ausgang ich erhielt, war.

$ ./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 

Ich konnte nicht die Linie verstehen

Die PID der Eltern des Kindes ist 1

Es sollte 3071 wurden?

+0

Sie würden das erwartete Verhalten beobachten, indem Sie 'fflush (NULL);' (vor dem 'fork') und' sleep (1); 'hinzufügen (sowohl in als auch in anderen Teilen des' if' und kurz vor dem Ende von 'main'). –

Antwort

12

Der Elternprozess ist beendet, wenn das Kind nach der PID seines Elternteils fragt.

Wenn ein Prozess beendet ist, werden alle seine Kinder als Kinder des Init-Prozesses neu zugewiesen, die pid 1.

ist Versuchen wait() im Eltern Code mit dem Kind zu warten, auszuführen. Es sollte dann funktionieren, wie Sie es erwarten.

0

pid 1 ist für init-Prozess und es sieht so aus, als ob der Elternprozess abgeschlossen wäre, bevor das Kind drucken konnte.

Wenn Sie den anderen Teil wie folgt bearbeiten: -

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); 
    } 

Sie sollten den richtigen Ausgang sehen.