linux中创建deamon进程的三种方法
什么是daemon进程?Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx,ssh服务进程sshd等。 为什么daemon进程需要特殊的编写步骤?daemon进程和普通进程不一样吗?为什么要单独提出如何编写daemon进程呢? > make & 让编译命令make到后台执行,这样只是造成了make在后台一直运行的假象,它依然没有脱离和terminal之间的父子关系; 如何编写daemon进程?对于可以用多种方法解决的问题,我们一般只需熟练掌握其中一种最适合自己的即可; 1. 首先给出经典名著APUE中的方法:#include "apue.h" #include <syslog.h> #include <fcntl.h> #include <sys/resource.h>void daemonize(const char *cmd){int i, fd0, fd1, fd2;pid_t pid;struct rlimit rl;struct sigaction sa;/* * Clear file creation mask. */umask(0);//注释1/* * Get maximum number of file descriptors. */if (getrlimit(RLIMIT_NOFILE, &rl) < 0)err_quit("%s: can't get file limit", cmd);/* * Become a session leader to lose controlling TTY. */if ((pid = fork()) < 0)//注释2err_quit("%s: can't fork", cmd);else if (pid != 0) /* parent */exit(0);setsid();//注释3/* * Ensure future opens won't allocate controlling TTYs. */sa.sa_handler = SIG_IGN;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if (sigaction(SIGHUP, &sa, NULL) < 0)err_quit("%s: can't ignore SIGHUP", cmd);if ((pid = fork()) < 0)//注释4err_quit("%s: can't fork", cmd);else if (pid != 0) /* parent */exit(0);/* * Change the current working directory to the root so * we won't prevent file systems from being unmounted. */if (chdir("/") < 0)//注释5err_quit("%s: can't change directory to /", cmd);/* * Close all open file descriptors. */if (rl.rlim_max == RLIM_INFINITY)rl.rlim_max = 1024;for (i = 0; i < rl.rlim_max; i++)close(i);//注释6/* * Attach file descriptors 0, 1, and 2 to /dev/null. */fd0 = open("/dev/null", O_RDWR);//注释7fd1 = dup(0);//注释7fd2 = dup(0);//注释7/* * Initialize the log file. */openlog(cmd, LOG_CONS, LOG_DAEMON);if (fd0 != 0 || fd1 != 1 || fd2 != 2) {syslog(LOG_ERR, "unexpected file descriptors %d %d %d",fd0, fd1, fd2);exit(1);} } 下面是针对上面例子的详细解释: * 注释1:因为我们从shell创建的daemon子进程,所以daemon子进程会继承shell的umask,如果不清除的话,会导致daemon进程创建文件时屏蔽某些权限。 针对这个例子,首先要说明的是,不管在Unix还是Linux上按照这个例子写的daemon肯定没问题。 1) 第二个fork是必须的吗? 2. 利用系统库函数daemon()创建daemon进程Linux系统还专门提供了一个用来创建daemon进程的系统函数: int daemon(int nochdir, int noclose); 从api的文档描述看该api也调用了fork(),估计内部实现和上面的代码逻辑类似,从其参数作用也可以看出这一点, #include <unistd.h> #include <stdlib.h>int main(void) {if(daemon(0,0) == -1)exit(EXIT_FAILURE);while(1){sleep(60);}return 0; } 3. 使用第三方工具supervisor简单的说supervisor是一个python工具,可以通过编写配置文件来对指定的进程进行管理,比如启动进程,停止进程以及进程退出后自动重启等; 参考资料http://www.cnblogs.com/mickole/p/3188321.html |
linux中创建deamon进程的三种方法相关推荐
- Linux中创建Daemon进程的三种方法
Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...
- Linux中增加软路由的两种方法,Linux中增加软路由的三种方法
# route add –net IP netmask MASK eth0 # route add –net IP netmask MASK gw IP # route add –net IP/24 ...
- 网络编程(32)—— linux中销毁僵尸进程的四种方法
一.wait函数 函数原型: pid_t wait(int *status); 描述: wait可以回收任意一个僵尸进程,只要系统中存在僵尸进程,调用一次wait,就会回收一个僵尸进程. 参数说明: ...
- Unity中创建游戏物体的三种方法:
通过new GameObject(); 通过Instantiate(): 通过GameObject.CreatePrimitive(): 总结: 1)new GameObject()可通过字符串名字来 ...
- 【export】Linux中export命令介绍,三种方法设置环境变量
✨ 因为一个变量创建时,它不会自动的被在它之后创建的shell进程所知:这时,可用export命令向后面的shell传递变量的值.
- Linux 中设置环境变量的三种方法
1.export 变量名=value 2.变量名=value ; export 变量名 3.declare -x 变量名=value 自定义全局环境变量 1.编辑 /etc/profile vim / ...
- linux系统中清空文件内容的三种方法
1.使用vi/vim命令打开文件后,输入"%d"清空,后保存即可.但当文件内容较大时,处理较慢,命令如下: vim file_name :%d :wq 2.使用cat命令情况,命令 ...
- Linux中执行shell脚本的5种方法总结
Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法: 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: c ...
- Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于:2012-09-15 ...
- Linux中执行shell脚本的4种方法
这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下. bash shell 脚本的方法有多种,现在作个小结.假设我们编写 ...
最新文章
- leangoo新增自定义模板、移动卡片、复制泳道功能
- 机动车号牌图像自动识别技术规范
- HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out的解决方法
- 2009 年 3月 二级 java
- php怎么使用多个数据库,怎么在php项目中使用CI对多个数据库进行操作
- 《Head First设计模式》第四章笔记 工厂模式
- Python(2)-第一个python程序、执行python程序三种方式
- UC浏览器电脑版怎么恢复被关闭的网页
- 企业管理软件随想-透视-包容,无形思想-有形方便
- 美团外卖自动化业务运维系统 - Alfred
- 【英语学习】【WOTD】bower 释义/词源/示例
- 计算机视觉目标检测算法总结4——其他SSD系列算法
- es6初识笔记(参看阮一峰ECAMscript6入门)
- What?!“天才黑客”竟是谣言,带你揭露阿里云守护神的秘密
- 改了计算机名字后重启断网了,电脑断网重启就好了是什么回事
- 企业信息系统集成发展阶段及ESB对企业的价值体现
- oss图片无法在网站中显示
- 小程序开发API之获取系统信息wx.getSystemInfo()、wx.getSystemInfoSync()
- CF 614 C Peter and Snow Blower (海伦公式、n个顶点绕圆扫过的最大面积)
- SSM三大框架从0到1,无障碍学习,萌新可入《二》
热门文章
- jqGrid设置表格列的背景色
- 单元测试1-为什么需要单元测试
- 怎么获取计算机用户权限,如何获取电脑的最高管理权限|细讲电脑最高管理权限的获取方式...
- 使用 sed 替换字符串中最后一次出现的字符
- opencv 表格识别之表格的提取(一)
- 【Android】之 App Startup 的使用及浅析
- 维吉尼亚密码原理详解及算法实现
- Java 编程问题:三、使用日期和时间
- 微信公众号一次性订阅消息功能开发实践
- 论文阅读:Neural Motifs: Scene Graph Parsing with Global Context