Unix fork父ID不一致

2 c unix fork

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char * argv[]) {
    printf("I am parent! My id: %d\n", (int)getpid());

    pid_t childPIDorZero = fork();

    if (childPIDorZero == -1) {
        perror("fork() error");
        exit(-1);
    }

    if (childPIDorZero == 0) {
        printf("Success. ID: %d, Parent ID: %d\n", (int)getpid(), (int)getppid());
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

1结果:

在此输入图像描述

2结果:

在此输入图像描述

我不明白这个故事.结果1为true但结果2为false但我没有做任何更改.为什么父ID结果不同?

ric*_*ici 7

因为父母从不等待孩子完成(见man waitpid).

因此,父母可以在孩子开始执行之前终止,在这种情况下,孩子将被重新分配.

该实验可能有趣的特征是新父母的pid是919,而不是预期的1.(正如维基百科文章中所解释的那样,没有父节点的子进程被赋予init进程,即pid 1.)但是,Linux有一个工具允许进程成为后代进程的"收割者",而Ubuntu启用此功能给每个用户自己的init过程.man 5 init如果您正在运行系统,请参阅"用户会话模式"部分upstart.