it-swarm.com.de

getpid und getppid geben zwei verschiedene Werte zurück

Wenn ich den Code unten ausführe 

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

}

Meine Ausgabe 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 kann sich die PID (20172) der Eltern von der ID der Eltern (1) unterscheiden? Sollten diese beiden nicht gleich sein?

16
Assasins

Was passiert, ist, dass das Elternteil beendet wird, bevor das Kind ausgeführt wird. Dadurch bleibt das Kind wie ein Waisenkind und wird vom Root-Prozess mit der PID von 1 übernommen. Wenn Sie eine Verzögerung setzen oder Daten aus stdin lesen, anstatt das übergeordnete Element beenden zu lassen, sehen Sie das erwartete Ergebnis. 

Process ID 1 ist normalerweise der init-Prozess, der hauptsächlich für das Starten und Herunterfahren des Systems verantwortlich ist. Das init (kurz für Initialisierung) ist ein Daemon-Prozess, der der direkte oder indirekte Vorfahr aller anderen Prozesse ist. Wiki-Link für init

Wenn user314104 darauf hinweist, sind die Funktionen wait () und waitpid () so ausgelegt, dass ein übergeordneter Prozess sich selbst anhalten kann, bis sich der Status eines untergeordneten Prozesses ändert. Ein Aufruf von wait () im übergeordneten Zweig Ihrer if-Anweisung würde also dazu führen, dass das übergeordnete Element wartet, bis das untergeordnete Element beendet ist. 

24
Jackson

Da der übergeordnete Prozess abläuft und freigegeben wird, wurde sein untergeordneter Prozess zu einem Orphan-Objekt, das init (kurz für Initialisierung), dessen PID 1 ist, erhielt den Orphan-Prozess.

0
Stone.Carton