文件:
ngx_daemon.c
函数:
1)ngx_daemon
解析:
1)ngx_daemon函数解析
思路如下:
这个函数是为了将当前进程变为后台进程。一切尽在源码中。
首先通过fork产生子进程,我们知道对于这个函数
父进程的fork返回的是子进程的进程ID,子进程返回的是0
我们假设父进程返回的是600,子进程返回0
则根据代码:
switch (fork()) {
case -1:
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
return NGX_ERROR;
case 0:
break;
default:
exit(0);
}
父进程通过exit(0)退出,子进程执行break跳出switch继续往下执行。
那么下面的若干操作都是针对子进程child.
~~~ 继续往下看。
ngx_pid = ngx_getpid();这个是获得当前进程ID.
然后调用了setsid()函数,我们看这个函数干嘛的?
这个函数是为了创建一个新的会话,并与父进程的会话组和进程组脱离关系。
一言以蔽之,一切都是崭新的。
然后执行umask(0);
该命令用来设置限制新文件权限的掩码,因为我们创建文件时指定的权限会与掩码进行
与操作。也就是不让父进程的文件掩码影响到自己后续的文件操作。
fd = open("/dev/null", O_RDWR);
这个是打开一个“黑洞”文件,对这个文件的操作不产生任何影响。
if (dup2(fd, STDIN_FILENO) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
return NGX_ERROR;
}
我们看dup2是什么意思。如果 dup2(a,b)
就是将b重定向到 a.
这里就是将标准输入STDIN_FILENO,实际上是0重定向到/dev/null.
dup2(fd, STDOUT_FILENO)一样的意思,就是将标准输出STDOUT_FILENO,实际上是1重定向到/dev/null.
最后是根据需要关闭fd.
ps:打开一个文件时,返回的文件描述符是当前进程使用文件描述符最大值+1,实际上这个反映在内核里是一个数组。