C 什么';daemonize这样做的目的是什么?

C 什么';daemonize这样做的目的是什么?,c,daemon,C,Daemon,这对我来说似乎毫无意义,因为它只改变pid,其他什么都没有 有什么好处?进程与终端分离,因此当启动它的用户退出会话时,进程仍在运行 Daemoning不仅仅涉及fork,它还涉及在子进程中调用setsid(2),将进程与控制终端分离。如果运行ps,您可以在tty列中看到标有?的进程 此外,当您启动守护程序时,它会在fork之后立即将控件返回shell,而不是shell必须等待进程终止。进程将与终端分离,因此当启动它的用户退出其会话时,进程仍在运行 Daemoning不仅仅涉及fork,它还涉及在

这对我来说似乎毫无意义,因为它只改变pid,其他什么都没有


有什么好处?

进程与终端分离,因此当启动它的用户退出会话时,进程仍在运行

Daemoning不仅仅涉及fork,它还涉及在子进程中调用
setsid(2)
,将进程与控制终端分离。如果运行
ps
,您可以在tty列中看到标有
的进程


此外,当您启动守护程序时,它会在fork之后立即将控件返回shell,而不是shell必须等待进程终止。

进程将与终端分离,因此当启动它的用户退出其会话时,进程仍在运行

Daemoning不仅仅涉及fork,它还涉及在子进程中调用
setsid(2)
,将进程与控制终端分离。如果运行
ps
,您可以在tty列中看到标有
的进程


此外,当您启动守护程序时,它会在fork之后将控件返回shell,而不是shell必须等待进程终止。

这样做的目的是中断父子链接。等待子进程的父进程将停止等待,因为子进程将生成守护进程,然后退出。

这会中断父进程与子进程之间的链接。等待子进程的父进程将停止等待,因为子进程将生成守护进程,然后退出。

该进程也将成为“进程组长”。请参阅此答案,其中包含更多详细信息:


流程也成为“流程组长”。请参阅此答案,其中包含更多详细信息:


但是这个进程到目前为止还没有父进程。@cpuer:父进程是shell或
init
或运行命令启动守护进程的人。启动守护进程的命令将成为子命令。子进程生成守护进程并退出,满足父进程的等待。但此进程到目前为止没有父进程。@cpuer:父进程是shell或
init
或运行命令启动守护进程的人。启动守护进程的命令将成为子命令。子进程生成守护进程并退出,满足父进程的等待。@Blagovest Buyukliev,你的意思是如果在
fork
之后未调用
setId
,shell仍将在那里等待吗?如果未调用
setId
,shell将不会等待,但进程将在启动它的用户注销后终止,通常,这对守护进程来说是不可取的。只有调用
setsid
才能将进程与控制tty分离,但不会将控制返回shell。@Blagovest Buyukliev,如果我运行一个调用
setsid()
但不调用
fork()
的程序a,那么如果我关闭shell,该程序a会存活吗?是的,尝试在shell中键入
setsid sleep 100
,关闭它,再打开它,看看进程是如何仍然存在的。@Blagovest Buyukliev,你的意思是如果
fork
之后没有调用
setid
,shell仍然会在那里等待吗?如果没有调用
setid
,shell将不会等待,但是进程将在启动它的用户注销后终止,这通常对守护进程来说是不可取的。只有调用
setsid
才能将进程从控制tty中分离出来,但不会将控制返回shell。@Blagovest Buyukliev,如果我运行一个调用
setsid()
而不是
fork()的程序a
,那么如果我关闭shell,该程序会继续运行吗?是的,请尝试在shell中键入
setsid sleep 100
,关闭它,再次打开它,然后查看进程如何仍然存在。
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);
    }