Nginx配置为以守护进程的方式运行时,在主函数里面会通过调用ngx_daemon来使自己切换为守护进程,具体配置项为"daemon on/off".
如果阅读过其他的服务端代码例如memcached,会发现这些程序切换为守护进程的方式基本是一致的,大致遵循如下几个步骤:
1.调用fork来创建一个子进程,并使父进程终止,然后子进程自动转化为守护进程
2.调用setsid来创建新会话,并使子进程成为会话组长,以此来脱离控制终端
3.调用umask来设置创建新文件的权限掩码
4.调用dup2重定向stdin、stdout和stderr到/dev/null(黑洞)
5.关闭stdin、stdout和stderr以外的文件描述符
以下代码摘自Nginx 0.1.0版本:
int 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);
}
ngx_pid = ngx_getpid();
if (setsid() == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");
return NGX_ERROR;
}
umask(0);