#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main ( void ) {
int pid, fpid, ppid;
fpid = fork();
printf ("fpid is is %d\n", fpid);
sleep(5);
if (fpid > 0) {
pid = getpid();
ppid = getppid();
printf ("\nThis is Parent. My pid %d. My parent's pid %d\n", pid, ppid);
} else if (fpid == 0) {
sleep(1);
pid = getpid();
ppid = getppid();
printf ("\nThis is Child. My pid %d. My parent'a pid %d\n", pid, ppid);
}
}
我认为当父进程ID为1时,意味着父进程已被终止,因此子进程被重新替换为1(init,第一个进程)。有没有理由说明父进程会被终止?
答案 0 :(得分:3)
因为孩子睡觉,所以当它调用getppid()
时,它的父母可能已经死亡,孩子将被重新定位到初始化过程(pid == 1)。
答案 1 :(得分:2)
父进程不会等待(通过wait(2)
)子进程完成。因此,如果父项在子项之前退出(它变为orphan process),则子进程将被重新替换(采用)到 init 进程,其进程ID通常为1.因此子进程表示其父进程ID为1.
请注意,init进程的ID在所有系统上不一定是1。 POSIX没有强制要求任何此类事情。