2011-06-01 62 views
1
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变化,什么都没有。像这样守护进程的目的是什么?

有什么好处?这样,当启动它的用户退出其会话,该进程仍然运行

回答

3

过程变得从终端分离。

Daemonizing不仅是叉,它涉及的子进程分离从控制终端的进程调用setsid(2)。如果运行ps,则可以在tty列中看到标记为?的进程。

此外,当您启动一个守护进程,它返回控制到shell后叉权,而不是等待进程结束的外壳。

+0

这对我来说很有意义。 – cpuer 2011-06-01 07:13:33

+0

@Blagovest Buyukliev,你的意思是shell如果在'fork'之后没有调用'setsid',它仍然会在那里等待? – cpuer 2011-06-01 07:18:39

+0

如果'setsid'未被调用,shell将不会等待,但在启动它的用户注销后该进程将终止,而通常这对于守护进程来说并不合适。 – 2011-06-01 07:20:12

1

这样做是打破父子链接。等待孩子的父母将停止等待,因为孩子会产生守护进程然后退出。

+0

但是这个过程迄今没有父母。 – cpuer 2011-06-01 07:12:55

+0

@cpuer:父节点是shell或'init'或任何人运行启动守护进程的命令。启动守护进程的命令成为孩子。孩子产生守护进程并退出,满足父母的等待。 – Gabe 2011-06-01 07:21:13