我正在阅读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*/
}
编辑:我知道该程序是为了对程序进行移植,但我仍然想知道为什么我们应该在开始时这样做?
答案 0 :(得分:2)
对程序进行移植的主要部分是将其与控制终端断开连接。
为此,请致电setsid()
。
setsid()
要求调用者不是进程组负责人(直接从具有作业控制的shell运行的进程)。
如果您fork
然后继续留在孩子身边,孩子绝对不会成为流程组负责人,这样就可以setsid()
来电成功。
之后,你应该重复fork + exit程序,以确保继续孙子也不是会话领导者,确保它没有控制终端(会话领导者(由setsid()
设置)具有这种能力获取控制终端,甚至可能通过打开终端文件意外地获取。