Unerwartete übergeordnete Prozess-ID in der Ausgabe

Unerwartete übergeordnete Prozess-ID in der Ausgabe

Mein Code verzweigt einen Prozess und gibt die PID und PPID jedes Prozesses aus. Ich hatte erwartet, dass die PPID des untergeordneten Prozesses mit der PID des übergeordneten Prozesses identisch ist, aber das ist nicht der Fall.

Ich verwende Ubuntu 14.04.

#include <stdio.h>
#include <sys/wait.h>

int main(){
    int pid;
    pid = fork();
    if(pid==0){
        printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid());
    }
    else
        printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid());

    return 0;
}

Hier ist die Ausgabe, die ich erhalte:

I am the parent and my pid is 29229 and my parent id is 27087
I am the child and my parent id is 1135 and my id is 29230

Antwort1

Meine Vermutung ist: Der übergeordnete Prozess wurde vor dem untergeordneten Prozess zurückgegeben, der verwaist ist. PID 1135 muss Ihr Benutzerinitprozess sein, der zum neuen übergeordneten Prozess des Prozesses wurde. (In einer Ubuntu-Benutzersitzung gibt es 2 Subreaper).

$ ps -ef | grep init
you    1135    ...    init --user

Wenn Sie möchten, dass Ihr übergeordnetes Element auf sein untergeordnetes Element wartet, verwenden Sie wait. Sie haben das eigentlich includeschon:

#include <stdio.h>
#include <sys/wait.h>

int main(){
    int pid;
    pid = fork();
    if(pid == 0)
        printf("\nI am the child and my parent id is - %d and mine id %d\n",getppid(),getpid());
    else{
       printf("\nI am the parent and my pid is %d and my parent id is %d\n",getpid(),getppid());
       wait(NULL);
    }
    return 0;
}

Dadurch wird sichergestellt, dass das übergeordnete Element nicht vor dem untergeordneten Element beendet wird printf. Sie können dieses Verhalten deutlicher erkennen, indem Sie sleep()hier und da ein paar Aufrufe einfügen, um zu sehen, in welcher Reihenfolge die Dinge geschehen.

Weitere Informationen zu Subreapern finden Sie unterschau mal hier.

verwandte Informationen