杀死父进程并让子进程在fork()之后运行的目的是什么?

时间:2017-06-01 04:29:11

标签: c linux nginx process fork

我正在阅读Nginx Open Source,我想知道为什么某人会杀死父进程并让子进程处理程序的其余部分?为什么不让父进程处理呢?非常感谢您的帮助。

我使用Eclipse CDT来调试程序,这导致我的调试陷入死胡同,因为它继续调试父进程,而不是子进程(实际处理程序的其余部分)。

以下是代码片段:

ngx_int_t
ngx_daemon(ngx_log_t *log)
{
    int  fd;
    switch (fork()) {
    case -1:
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
        return NGX_ERROR;

    case 0:

        break;

    default:
    exit(0);

    }
/* Do stuff*/
}

编辑:我知道该程序是为了对程序进行移植,但我仍然想知道为什么我们应该在开始时这样做?

1 个答案:

答案 0 :(得分:2)

对程序进行移植的主要部分是将其与控制终端断开连接。

为此,请致电setsid()

setsid()要求调用者不是进程组负责人(直接从具有作业控制的shell运行的进程)。

如果您fork然后继续留在孩子身边,孩子绝对不会成为流程组负责人,这样就可以setsid()来电成功。

之后,你应该重复fork + exit程序,以确保继续孙子也不是会话领导者,确保它没有控制终端(会话领导者(由setsid()设置)具有这种能力获取控制终端,甚至可能通过打开终端文件意外地获取。