#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 为真,结果 2 为假,但我没有做任何更改。为什么父 ID 结果不同?
最佳答案
因为 parent 从不等待 child 完成(参见 man waitpid
)。
因此,父级甚至可以在子级开始执行之前终止,在这种情况下,子级将是 reparented .
该实验可能有趣的特征是新父代的 pid 是 919,而不是预期的 1。 (如维基百科文章中所述,没有父进程的子进程被分配给 init
进程,即 pid 1。)但是,Linux 有一个机制允许进程成为后代的“收割者”进程,而 Ubuntu 启用此功能可以为每个用户提供他们自己的 init
进程。如果您正在使用 upstart
运行系统,请参阅 man 5 init
中的“用户 session 模式”部分。
关于c - Unix fork parent id 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676490/