#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-结果:
2 - 结果:
我不明白这个故事。结果1为true但结果2为false但我没有做任何更改。为什么父ID结果不同?
答案 0 :(得分:7)
因为父母从不等待孩子完成(见man waitpid
)。
因此,父母可以在孩子开始执行之前终止,在这种情况下,孩子将是reparented。
该实验可能有趣的特征是新父母的pid是919,而不是预期的1。 (正如维基百科文章中所解释的那样,没有父节点的子进程被赋予init
进程,即pid 1.)但是,Linux有一个工具允许进程成为后代进程的“收割者”,并且Ubuntu支持此功能为每个用户提供自己的init
进程。如果您使用man 5 init
运行系统,请参阅upstart
中的“用户会话模式”部分。