C 为什么这个ppid==1?我是否遗漏了有关fork()的内容?
为什么3884过程的ppid为1?不是应该是3883吗?我猜在第三个子进程检查父进程的PID时,父进程已经完成运行并退出。这将导致子项在进程ID为1的C 为什么这个ppid==1?我是否遗漏了有关fork()的内容?,c,fork,C,Fork,为什么3884过程的ppid为1?不是应该是3883吗?我猜在第三个子进程检查父进程的PID时,父进程已经完成运行并退出。这将导致子项在进程ID为1的init下重新成为父项。取自: “getppid()返回的值是调用进程的父进程的进程ID。进程ID值为1表示没有与调用进程关联的父进程。” 该printf指令是在父进程内执行的,因此它返回1,因为它没有父进程。这是要打印的第三行,这是完全正常的,因为fork同时运行其进程,并且不保证特定的顺序 当进程3883从main返回并且不再存在时,它怎么可
init
下重新成为父项。取自:
“getppid()返回的值是调用进程的父进程的进程ID。进程ID值为1表示没有与调用进程关联的父进程。”
该printf指令是在父进程内执行的,因此它返回1,因为它没有父进程。这是要打印的第三行,这是完全正常的,因为fork同时运行其进程,并且不保证特定的顺序 当进程3883从main返回并且不再存在时,它怎么可能是3883?如果它没有退出,这将是一个很好的方法,使您的系统不起作用。我不认为这可以解释观察到的症状。运行
/a.out
的原始进程应该将shell作为其父进程。这是一个很好的猜测:)我在代码中添加了一个sleep\u for
(请参见问题),时间比运行程序所用的时间长。只要我能保持父对象在所有子对象完成执行之前,ppid就不会返回为“1”。感谢杰米·夏普的启发。
#include <stdio.h>
int main(void)
{
fork();
fork();
printf("ppid %d pid %d\n", getppid(), getpid());
return 0;
}
$ ./a.out
ppid 3389 pid 3883
ppid 3883 pid 3885
ppid 1 pid 3884
ppid 3884 pid 3886