Unix fork parent id 不一致
Unix fork parent id inconsistent
#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 为假,但我没有做任何更改。为什么 parent ID 结果不同?
因为 parent 从不等待 child 完成(参见 man waitpid
)。
因此,parent 甚至可能在 child 开始执行之前终止,在这种情况下 child 将是 reparented。
该实验可能有趣的特征是新 parent 的 pid 是 919,而不是预期的 1。 (如维基百科文章中所述,child 没有 parent 的进程被分配给 init
进程,即 pid 1。)但是,Linux 有一个设施允许成为 "reaper" 后代进程的进程,并且 Ubuntu 启用此功能可以为每个用户提供自己的 init
进程。如果您是 运行 具有 upstart
的系统,请参阅 man 5 init
中的 "User Session Mode" 部分。
#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 为假,但我没有做任何更改。为什么 parent ID 结果不同?
因为 parent 从不等待 child 完成(参见 man waitpid
)。
因此,parent 甚至可能在 child 开始执行之前终止,在这种情况下 child 将是 reparented。
该实验可能有趣的特征是新 parent 的 pid 是 919,而不是预期的 1。 (如维基百科文章中所述,child 没有 parent 的进程被分配给 init
进程,即 pid 1。)但是,Linux 有一个设施允许成为 "reaper" 后代进程的进程,并且 Ubuntu 启用此功能可以为每个用户提供自己的 init
进程。如果您是 运行 具有 upstart
的系统,请参阅 man 5 init
中的 "User Session Mode" 部分。