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);
}
对我来说似乎毫无意义,因为它只改变了pid,没有别的。
有什么好处?
答案 0 :(得分:3)
该进程与终端分离,以便当启动它的用户退出其会话时,该进程仍在运行。
守护进程不仅涉及fork,还涉及在子进程中调用setsid(2)
,将进程与控制终端分离。如果您运行ps
,您可以在tty列中看到标有?
的流程。
此外,当你启动一个守护进程时,它会在fork之后立即将控件返回给shell,而不是shell必须等待进程终止。
答案 1 :(得分:1)
这样做会破坏父子链接。等待孩子的父母将停止等待,因为孩子将产生守护进程然后退出。
答案 2 :(得分:1)
该流程也成为“流程组负责人”。请参阅此答案,其中包含更多详细信息: