学习nginx已经有一个多月了,觉得越来越吃力了,主要原因自己总结了一下:1平台是基于linux的,以前几乎没有接触过linux,而nginx使用了很多linux的函数;2就是进程,这个东西接触的也很少,linux的多进程更不用说,而现在正好看到这里,觉得异常的吃力,这不看到nginx守护进程的建立,就找资料好好学习一下,所以本文已学习fork为主要内容。
好了,先看一下nginx的守护进程的建立,然后在学习fork。
http://blog.csdn.net/xiaoliangsky/article/details/39998373
1nginx的守护进程
直接看代码:
ngx_int_t ngx_daemon(ngx_log_t *log)
{
int fd;
switch (fork()) {//用fork创建守护进程
case -1://fork返回-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);//重设文件创建掩模
/*重定向标准输入、输出到/dev/null(传说中的黑洞)*/
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"open(\"/dev/null\") failed");
return NGX_ERROR;
}
if (dup2(fd, STDIN_FILENO) == -1) {//输入重定向到fd,即从/dev/null输入
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
return NGX_ERROR;
}
if (dup2(fd, STDOUT_FILENO) == -1) {//输出重定向到fd,即所有输出到/dev/null
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
return NGX_ERROR;
}
#if 0
if (dup2(fd, STDERR_FILENO) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");
return NGX_ERROR;
}