nginx的守护进程学习
来源:互联网 发布:背包问题 动态规划java 编辑:程序博客网 时间:2024/05/22 10:52
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); } ngx_pid = ngx_getpid(); if (setsid() == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed"); return NGX_ERROR; } umask(0); 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) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed"); return NGX_ERROR; } if (dup2(fd, STDOUT_FILENO) == -1) { 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; }#endif if (fd > STDERR_FILENO) { if (close(fd) == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed"); return NGX_ERROR; } } return NGX_OK;}
上面是ngx_daemon.c的代码,在执行此函数前面ngx的main函数,完成了主程序的初始化;在执行完这个函数后,主程序退出,nginx进入后台守护进程的运行模式。
关键的部分,在于fork这一句。
fork返回两个值,分别对应于主程序,和子程序,对于主程序,返回的是,大于0的一个数(子程序的pid),直接exit(0);对于子程序,返回的是0,这里通过switch,case后,进程直接进入子程序后台运行了。
setsid,umask,/dev/null分别对应设置进程组,清除掩模,重定向输出位置。是守护进程必须的三个设置。
gdb跟进fork前,如果想看nginx的如何在后台工作,需要设置子进程调试,具体方法是在gdb console下,输入:
set follow-fork-mode child另外,想回到主进程调试,设置为parent,就可以了。
阅读全文
0 0
- nginx的守护进程学习
- 守护进程的学习
- nginx代码学习_第一章守护进程
- nginx学习十三 初始fork和nginx守护进程ngx_daemon
- Linux下学习守护进程的笔记
- linux学习 - 守护进程
- Linux学习-守护进程
- 守护进程学习
- 守护进程学习
- 进程学习:5- 守护进程
- 进程学习:4-守护进程的出错记录
- 什么是守护进程?守护进程的特性
- UNIX环境高级编程学习之第十三章守护进程 - 单实例的守护进程
- 守护进程的原理
- 守护进程的原理
- 守护进程的编写
- 守护进程的理解
- 守护进程的实现
- java 多线程 例子
- 计算组合数
- 面试题随手练习(一)
- 为中国梦添砖加瓦,海航集团怎么样
- 写在冬日的第一天——一个女程序员第十二年工作总结
- nginx的守护进程学习
- 2018 年你应该了解的十大技术趋势
- 磁盘空间的动态管理<Lvm>
- 记一次网易前端面试
- C 的数据类型
- Java开发手册(五):安全规约与单元测试
- 系统广播android.intent.action.DATE_CHANGED不响应的问题
- Proposition
- Spring 出现No WebApplicationContext found解决方法