我似乎有一个模糊的记忆,Linux中的某些工具存在,它允许一个fork()进程,以便系统自动收集子进程而不创建僵尸。这个机制是什么?或者我的记忆错了吗?
答案 0 :(得分:3)
执行此操作的便携方式是双叉:
pid = fork();
if (pid>0) {
int status;
while (waitpid(pid, &status, 0) && !WIFEXITED(status) && !WIFSIGNALED(status));
if (WIFSIGNALED(status) || WEXITSTATUS(status)) goto error;
} else if (!pid) {
pid = fork();
if (pid) _exit(pid<0);
else {
// do child work here
_exit(0);
}
} else goto error;
答案 1 :(得分:3)
我在考虑使用Glib的g_spawn_*方法来自动收割孩子,除非你指定你不想要这种默认行为。
答案 2 :(得分:2)
您可以忽略SIGCHLD,因此它不会创建僵尸;)
signal(SIGCHLD, SIG_IGN);
doc here:http://man7.org/linux/man-pages/man2/sigaction.2.html
答案 3 :(得分:0)
这也可以通过prctl()
完成 prctl(PR_SET_PDEATHSIG, SIGTERM);
在子进程中插入的上述行会在父进程死亡时导致其终止。当任何子收割者死亡时(在父进程成为父进程之后),这也可以工作,如果您需要杀死父进程是实际父级的死亡,则将父级的pid
存储在fork()
之前并检查它在子进程中。
if (getppid() != parent_pid_before_fork)
exit(1);