Unix fork父ID不一致

时间:2016-02-27 22:54:06

标签: 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;
}

1-结果:

enter image description here

2 - 结果:

enter image description here

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

1 个答案:

答案 0 :(得分:7)

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

因此,父母可以在孩子开始执行之前终止,在这种情况下,孩子将是reparented

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