如何以一种不需要收割孩子的方式进行分叉过程

时间:2016-10-26 23:58:14

标签: c linux pthreads fork

我似乎有一个模糊的记忆,Linux中的某些工具存在,它允许一个fork()进程,以便系统自动收集子进程而不创建僵尸。这个机制是什么?或者我的记忆错了吗?

4 个答案:

答案 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);