2017-06-01 111 views
3

我正在阅读Nginx的开放源代码,我想知道为什么有人杀死父进程并让子进程处理程序的其余部分?为什么不让父进程处理它?非常感激你的帮助。杀死父进程并在fork()之后离开子进程的目的是什么?

我使用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*/ 
} 

编辑:我理解的过程是一个deamonizing程序,但我一直在想,为什么我们应该做的是,在开始?

+7

这是将守护程序与父进程的执行环境断开连接的一种方法。这也是让程序继续在后台运行的一种方式,而用户可以单独继续工作,这在今天的后台作业的shell中并不是非常需要,只留下第一个原因。 –

+2

如果您为每个查询分支,当您更改配置时,您想让分支完成他们的工作,并杀死父级以使用新配置启动一个新配置 –

+0

@Someprogrammerdude,谢谢您的回复。但是,您介意解释为什么我们应该将守护进程从父进程的执行环境中断开?我已经阅读了Linux中的守护进程,但我仍然没有清楚地理解它。非常感谢:) –

回答

2

对程序进行deamonizing的主要部分是将其与控制终端断开连接。请致电setsid()

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

如果你fork然后继续在孩子,孩子绝对不会是一个过程组的领导者,它允许setsid()调用成功。

之后,您应该重复fork + exit程序,以确保继续的孙子不是会议的领导者,确保它仍然没有控制终端(会话领导者(由setsid()设置)有能力获取控制终端,甚至可能无意中通过打开终端文件)。

+0

所以我假设deamonize程序的目的是让它在后台运行并等待请求。为此,我们不是在代码中使用循环,而是在每一个循环中用'fork()'和'exit()'父进程对它进行deamonize,这是否正确? –

+2

程序的实现主要是将它与控制终端断开连接。守护进程的功能(无论是将hello world打印到日志并退出还是进入服务器环路)与其deamon状态(无控制终端+一些其他小细节)无关。检查出https://stackoverflow.com/questions/3095566/linux-daemonize – PSkocik

+0

嗨@PSkocik,我明白现在deamonizing程序的程序。不过,我仍然对于一开始就将它毁灭的目的感到困惑。根据你的回复,我认为我的第一个假设是错误的。那么,为什么我们需要“从控制终端上断开一个程序”呢? –