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 脚本的方法有多种,现在作个小结.假设我们编写 ...
最新文章
- HDU 1816, POJ 2723 Get Luffy Out(2-sat)
- 题目1207:质因数的个数
- java jvm调优面试题_【Java面试题第一期】有没有jvm调优经验?调优方案有哪些?...
- jquery-ui寺
- Layui简介、layui例子
- MySQL的常用SQL脚本
- Java生成MD5码
- 【Android】LMK 工作机制
- Flutte的ListView不能直接嵌套ListView解决办法
- 成都Uber优步司机奖励政策(1月26日)
- 数据库课程设计报告(毕业生管理系统)
- 三权鼎立形式的软件开发方式
- 运用PS做图片快捷键
- python实现文本编辑器_Python实现的文本编辑器功能示例
- J1800N-D2H主板升级bios,安装Fedora20,并搭建开发环境
- 单个字符的输入输出函数
- CSMA/CD协议详解
- 某Q音乐最新歌曲查询API 可用!
- Qt 多线程中地信号与槽
- vue+elementui+springboot前后端分离实现学校帖子网站,模拟“淘柳职”学校大作业