拾遗:Unix 守护进程编写规范
//标准库自带函数,通常以 daemon(0, 0) 方式调用
int daemon(int nochdir, int noclose) Linux:
#include <unistd.h> FreeBSD:
#include <stdlib.h>
//自主实现原理如下
[a] 编写守护进程的要点
- 指定 umask 值,由环境继承来的默认权限有可能存在问题
- 使该守护进程成为一个孤儿进程组中的唯一成员:
- fork 之后终止父进程,此举确保不是进程组首进程,然后 setsid 创建新会话
- 丢弃会话首进程身份(再次 fork),从而确保了该进程不会获得控制终端
- 切换到正确的工作目录中
- 如果没有关联的配置文件,则可以设置 SIG_IGN 忽略 SIG_HUP 信号
- 关闭不需要的文件描术符,可以将常用的 0、1、2 三个描述符关联至 /dev/null,以防止意外 I/O
[b] 样例
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/resource.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h> void daemonize(const char *);
char *workdir = "/"; int
main(void)
{
daemonize(workdir);
while()
{
sleep();
}
} void
daemonize(const char *workdir)
{
pid_t pid;
int fd0, fd1, fd2;
struct rlimit rl;
struct sigaction sa; umask();
chdir(workdir); pid = fork();
if (pid < )
{
perror("fork");
}
else if (pid > )
{
_exit();
} setsid(); pid = fork();
if (pid < )
{
perror("fork");
}
else if (pid > )
{
_exit();
} if (- == getrlimit(RLIMIT_NOFILE, &rl))
{
perror("getrlimit");
}
if (rl.rlim_max == RLIM_INFINITY)
{
rl.rlim_max = ;
}
for(pid = ; pid < rl.rlim_max; ++pid)
{
close(pid);
} fd0 = open("/dev/null", O_RDWR);
fd1 = dup2(fd0, );
fd2 = dup2(fd0, ); sa.sa_handler = SIG_IGN;
sa.sa_flags = ;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGHUP, &sa, NULL) < )
{
perror("sigaction");
}
}
...
拾遗:Unix 守护进程编写规范的更多相关文章
- Unix守护进程
问题描述: Unix守护进程 问题解决: Unix守护进程没有控制终端,终端名设置为问号(?),终端前台进程组ID设置(TPGID)为-1 守护进程编写规则: (1) ...
- linux C守护进程编写
linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服 ...
- Linux守护进程编写指南
Linux守护进程编写指南 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进 程.Linux的大多数服务器 ...
- 编写Linux/Unix守护进程
原文: http://www.cnblogs.com/haimingwey/archive/2012/04/25/2470190.html 守护进程在Linux/Unix系统中有着广泛的应用.有时,开 ...
- linux守护进程编写实践
主要参考:http://colding.bokee.com/5277082.html (实例程序是参考这的) http://wbwk2005.blog.51cto.com/2215231/400260 ...
- 【APUE】【转】守护进程编写
http://blog.csdn.net/zg_hover/article/details/2553321 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务 ...
- Linux守护进程编写方法及原理
什么守护进程? 守护进程是运行在后台的一种用来提供服务的进程,他脱离控制台独立运行,守护进程是一种很有用的进 程. Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd ...
- supervisor运行golang守护进程
最近在鼓捣golang守护进程的实现,无意发现了supervisor这个有意思的东西.supervisor是一个unix的系统进程管理软件,可以用它来管理apache.nginx等服务,若服务挂了可以 ...
- Linux下一个简单守护进程的实现 (Daemon)
在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程 ...
随机推荐
- 如何使用android-support-V7包中ActionBar(Eclipse版)
$*********************************************************************************************$ 博主推荐 ...
- js设计模式——1.代理模式
js设计模式——1.代理模式 以下是代码示例 /*js设计模式——代理模式*/ class ReadImg { constructor(fileName) { this.fileName = file ...
- thinkphp 表单令牌
表单令牌 ThinkPHP支持表单令牌验证功能,可以有效防止表单的重复提交等安全防护.要启用表单令牌功能,需要配置行为绑定, 在应用或者模块的配置目录下面的行为定义文件tags.php中 就是在你的 ...
- Linux上VNC 启动和关闭
查询vnc的线程: [admin@cn2-uat-esb-01-0001 ~]$ ps -ef|grep vncadmin 19080 21305 0 10:04 pts/2 00:00:00 gre ...
- Microsoft specification
http://msdn.microsoft.com/en-US/ 搜索 specification 搜索"PE COFF specification",得到一篇Microsoft官 ...
- super_blocks没有导出
在模块中,通过查询super_blocks列表,来遍历系统中的所有super_block,但是出现与下面类似的错误: http://stackoverflow.com/q/5051111/941650 ...
- MyBatis-Spring(二)--SqlSessionTemplate实现增删改查
SqlSessionTemplate是个线称安全的类,每运行一个SqlSessionTemplate时,它就会重新获取一个新的SqlSession,所以每个方法都有一个独立的SqlSession,这意 ...
- 统计HDFS 上字节数据统计
class HDFSWordCount { def main (args: Array[String]) { if (args.length > 0){ for (line <- Sour ...
- 高级UI晋升之布局ViewGroup(四)
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从LinearLayout.RelativeLayout.FrameLa ...
- python面试题之多线程好吗?列举一些让Python代码以并行方式运行的方法
答案 Python并不支持真正意义上的多线程.Python中提供了多线程包,但是如果你想通过多线程提高代码的速度,使用多线程包并不是个好主意.Python中有一个被称为Global Interpret ...