2013-03-03 13 views
15

zurückkehren Wenn ich den Code untergetpid und getppid zwei verschiedene Werte

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

} 

Mein Ausgang laufen ist

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 

Wie die PID des Elternteil kann (20172) von dem Kind unterscheiden sich die Eltern-ID (1) ? Sollten diese beiden nicht gleich sein?

Antwort

24

Was passiert ist, dass der Elternteil beendet wird, bevor das Kind ausgeführt wird. Dadurch bleibt das Kind als Waisenkind und es wird vom Root-Prozess mit der PID von 1 übernommen. Wenn Sie eine Verzögerung eingeben oder Daten von stdin lesen, anstatt die Eltern abbrechen zu lassen, sehen Sie das Ergebnis, das Sie erwarten.

Prozess ID 1 ist in der Regel der Init-Prozeß in erster Linie verantwortlich für das Starten und Abschalten des Systems. Die Init (kurz für die Initialisierung) ist ein Daemon-Prozess, der der direkte oder indirekte Vorfahre aller anderen Prozesse ist. wiki link for init

Wie user314104 die Warte weist darauf hin,() und waitpid() Funktionen sind so konzipiert, ein Eltern-Prozess zu ermöglichen, sich von einem Kind-Prozess ändert, bis der Zustand zu suspendieren. Ein Aufruf von wait() im übergeordneten Zweig Ihrer if-Anweisung würde dazu führen, dass der übergeordnete Server auf das Beenden des untergeordneten Elements wartet.

+1

Oder konventioneller, wait() und waitpid(). – user314104

+1

@Jackson hat weitere Informationen mit Link hinzugefügt. Ich denke, es muss deine gute Antwort vervollständigen. wenn du es nicht magst, rückgängig zu machen. –

0

Da der Parent-Prozess abläuft und freigegeben wird, wurde sein untergeordneter Prozess ein Orphan, die Init (kurz für die Initialisierung), deren PID 1 ist, den verwaisten Prozess erhalten.