Почему getppid () из дочернего возврата 1

я запускал программу

#include<stdio.h>
#include <unistd.h>
main()
{
    pid_t pid, ppid;
    printf("Hello World1n");
    pid=fork();
    if(pid==0)
    {
        printf("I am the childn");
        printf("The PID of child is %dn",getpid());
        printf("The PID of parent of child is %dn",getppid());
    }
    else
    {
        printf("I am the parentn");
        printf("The PID of parent is %dn",getpid());
        printf("The PID of parent of parent is %dn",getppid());        
    }
}

выходной у меня был.

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

Я не мог понять строку

PID родителя ребенка равен 1

Он должен был 3071?

2 ответов


потому что родительский процесс завершен к тому времени, когда ребенок запрашивает Родительский pid.

когда процесс завершится, все его дети переводятся как детей процесс init, который пид-1.

попробуйте использовать wait() в коде родителя, чтобы дождаться выполнения ребенка. Тогда он должен работать так, как вы ожидаете.


pid 1 предназначен для процесса инициализации, и похоже, что родительский процесс завершен до того, как ребенок сможет распечатать.

Если вы редактируете другую часть следующим образом: -

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

вы должны увидеть правильный выход.