我正在尝试将僵尸进程包裹住,在什么时候获得子进程。我了解从父级调用wait
或waitpid
时会获得子级进程。
我想知道是否还有其他情况会影响子进程。
我的代码:
int main() {
int pid = fork();
int exit_status;
if (pid == 0) {
exit(1); // exit immediately from child.
} else {
pause(); // keep the parent running
}
}
现在,当我运行ps -a
时,一切都有意义。父进程正在运行,子进程已退出,但尚未获得:
$ ps -a
PID TTY TIME CMD
442 pts/0 00:00:00 a.out
443 pts/0 00:00:00 a.out <defunct>
447 pts/1 00:00:00 ps
但是,当我将代码更改为:
int main() {
int exit_status;
if (fork() == 0) {
// exit immediately from child.
exit(1);
} else {
// exit from parent immediately
exit(1);
}
}
看来孩子和父母都被收割了。我在网上阅读的所有内容都指出,该子对象将由init进程(pid 1)继承,并且仍然是僵尸进程。如果是这种情况,在父级退出后,我仍然应该能够看到子级进程。
但是ps -a
没有显示任何僵尸子进程...
$ ps -a
PID TTY TIME CMD
470 pts/1 00:00:00 ps
我的子流程发生了什么?