Linux守护进程实现
Linux守护进程
redis版:
void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); /* create a new session *//* Every output goes to /dev/null. If Redis is daemonized but* the 'logfile' is set to 'stdout' in the configuration file* it will not log at all. */if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);if (fd > STDERR_FILENO) close(fd);}
}
memcached版:
int daemonize(int nochdir, int noclose)
{int fd;switch (fork()) {case -1:return (-1);case 0:break;default:_exit(EXIT_SUCCESS);}if (setsid() == -1)return (-1);if (nochdir == 0) {if(chdir("/") != 0) {perror("chdir");return (-1);}}if (noclose == 0 && (fd = open("/dev/null", O_RDWR, 0)) != -1) {if(dup2(fd, STDIN_FILENO) < 0) {perror("dup2 stdin");return (-1);}if(dup2(fd, STDOUT_FILENO) < 0) {perror("dup2 stdout");return (-1);}if(dup2(fd, STDERR_FILENO) < 0) {perror("dup2 stderr");return (-1);}if (fd > STDERR_FILENO) {if(close(fd) < 0) {perror("close");return (-1);}}}return (0);
}
lighttpd版:
#ifdef HAVE_FORK
static void daemonize(void) {
#ifdef SIGTTOUsignal(SIGTTOU, SIG_IGN);
#endif
#ifdef SIGTTINsignal(SIGTTIN, SIG_IGN);
#endif
#ifdef SIGTSTPsignal(SIGTSTP, SIG_IGN);
#endifif (0 != fork()) exit(0);if (-1 == setsid()) exit(0);signal(SIGHUP, SIG_IGN);if (0 != fork()) exit(0);if (0 != chdir("/")) exit(0);
}
#endif
nginx版:
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 0if (dup2(fd, STDERR_FILENO) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");return NGX_ERROR;}
#endifif (fd > STDERR_FILENO) {if (close(fd) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");return NGX_ERROR;}}return NGX_OK;
}
注释版:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>int daemonize(void)
{int fd;switch(fork()) {case -1:return (-1);case 0:break;default://将父进程结束,让子进程变成真正的孤儿进程,并被init进程接管exit(0);}//子进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离setsid();if ((fd = open("daemon.log", O_CREAT|O_RDWR|O_APPEND, 0)) != -1) {//dup2(int oldhandle, int newhandle)复制文件句柄dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);//0,1和2文件句柄分别与标准输入,标准输出,标准错误输出相关联//所以用户应用程序调用open函数打开文件时,默认都是以3索引为开始句柄//fd已经由新的句柄代替,关闭fd句柄if (fd > STDERR_FILENO) (void)close(fd);}return 0;
}int main(int argc, char *argv[])
{daemonize();printf("%s\n","hello");return 0;
}
# cc daemonize.c -o daemonize
# ./daemonize
# ps aux | grep daemonize
参考:
http://blog.linuxphp.org/archives/1476/
http://www.cnblogs.com/xuxm2007/archive/2011/07/29/2121280.html
http://blog.csdn.net/yyyzlf/article/details/5267954
http://docs.linuxtone.org/ebooks/C&CPP/c/ch34s03.html
Linux守护进程实现相关推荐
- Linux 命令详解(六)Linux 守护进程的启动方法
Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html
- .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...
- .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇
Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...
- .NET跨平台实践:用C#开发Linux守护进程
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- 深入理解Linux守护进程
深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daem ...
- Linux守护进程的创建(结合nginx框架)
Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...
- linux+守护进程+php,【转载】Linux 守护进程的编程方法
[转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...
- linux 守护进程_网络工程师之linux守护进程
Linux守护进程就是通常所说的DEAMON进程,linux后台服务多种多样,每一个服务都运行一个对应的程序,这些后台程序对应的进程就是守护进程.系统中可以看到很多如DHCPD和HTTPD之类的进程, ...
- 【Linux】Linux 守护进程的启动方法
转载:Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 W ...
最新文章
- 对一个伪装成微信的加固病毒的分析
- 从Linux系统内存逐步认识Android应用内存
- python @的用法
- 2020全国高中清华北大录取人数榜,各位学生快看!
- 解决AttributeError: 'module' object has no attribute 'main' 安装第三方包报错
- oracle cpu 利用率过高 kswapd0_服务器带宽监测与利用率过高的解决办法
- ITK:从函数返回对象
- 两个服务之间的调用请求
- C语言内存/指针相关
- 为什么写公众号,为什么改名字
- Intellij IDEA+Tomcat+JRebel热部署
- Samba的配置与使用
- IE安全防护方面强于Firefox和Chrome
- MacOS罗技鼠标定义的功能键经常失灵
- 『杭电1206』劲乐团
- 电脑win7蓝屏没有修复计算机,手把手教你win7蓝屏如何修复
- 软件项目管理经验总结
- 解决网上有重名的问题
- 通过一个具体的例子,讲解 SAP BDC 技术的使用步骤
- anaconda下安装pytorch超详细步骤(有问题可以在评论区提问会及时解答)
热门文章
- 程序员在职场中想快速升职,这4种潜质少不得!
- Java IDEA import sun.reflect.ConstructorAccessor报错
- PyTorch框架:(1)基本处理操作
- 力扣(LeetCode)刷题,简单题(第11期)
- keras 的 example 文件 antirectifier.py 解析
- 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码
- 211大学计算机系分数,这四所211大学,分数线超过不少985,分数低的还真不敢轻易报考...
- 基于VTK的Delaunay的三角剖分算法
- 在Ubuntu 16.04.1 LTS上测试Linux AIO功能实录
- active set + serving cell