守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。
总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程.
分四步:
1) 创建子进程,脱离父进程,
为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。
2) 脱离控制终端,登录会话和进程组 :
进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。
控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:
3) 禁止进程重新打开控制终端 :
现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
4)关闭打开的文件描述符:
进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误
static void deamonize()
{
int fd;
int pid;
if(pid = fork()) {
exit(0); /* parent process, exit it */
} else if(pid < 0) {
spd_log(LOG_ERROR, "error when fork\n");
exit(0); /* error */
} else {
if(setsid() < 0) {
spd_log(LOG_ERROR, "error when change session id");
exit(0);
}
}
/* child proc, for now , we are session leader and process group leader */
if(pid = fork()) {
exit(0); /* kill child */
} else if(pid < 0) {
spd_log(LOG_ERROR, "error when fork\n");
exit(0);
}
/* child child proc, we are no longer the session leader and process group leader */
/* ignore fd leak */
fd = open("/dev/null", O_RDONLY);
if(fd != 0) {
dup2(fd, 0);
close(fd);
}
fd = open("/dev/null", O_WRONLY);
if(fd != 1) {
dup2(fd, 1);
close(fd);
}
fd = open("/dev/null", O_WRONLY);
if(fd != 2) {
dup2(fd, 2);
close(fd);
}
}
分享到:
相关推荐
在Linux下用QT开发Daemon程序.pdf
linux系统服务程序需要一定的稳定性,那么守护程序可以使你的服务提供不间断的服务。这里是守护程序的简单实现。
守护进程是长期运行的一种进程,不会与任一控制台绑定,如terminal、tty等,...Linux系统中守护进程的生命周期是从开机起至关机结束。当然可以强制结束一个守护进程,使用kill -9(PID)就能强制把某一守护进程关闭。
虚拟光驱.听说现在居然收费了...
DeamonTools4.12.1虚拟光驱 DeamonTools4.12.1
最新汉化Deamon4.3 (支持Viata) 现在网上有很多游戏和软件都做成了ISO或者CCD等镜像格式,有些游戏,比如大宇出品的轩辕剑,大富翁7等游戏,由于游戏盘是加密的,所以镜像文件只能做成mds格式的。当你辛辛苦苦下载...
最新最好用的虚拟光驱,就是Deamontools advanced 5.2 只用最新版
这个是早期的 deamon tools ,小巧,不收费的。现在的已经开始收费,并且增加了N多无用的小插件,且体积也变大了。
live_deamon.dllC++版本的数据集里面如果某一个样本的某一个特征为0,这个特征可以不写在数据集中,但是在matlab版本中
现在我们手里有很多的ISO文件,这一款软件就是一款很好用的虚拟光驱,把你的ISO文件展示出来。
本软件是一款DEAMON虚拟光驱软件的高级版本(or专业版),可以实现添加SCSI虚拟光驱和添加IDE虚拟光驱,在安装时需要验证,请确保你在联网的状态下安装。
进到cli模式下,执行 service myqsld start 发现还是提示”mysql deamon failed to start”错误信息. # /etc/init.d/mysqld start MySQL Daemon failed to start. Starting mysqld: [FAILED] 查看mysqld的log文件 #...
deamon tools for read img files
deamon tools 虚拟光驱 很好用的虚拟光驱
虚拟光驱 好用,非常好用,你必须要用,哈哈
DEAMON TOOLS 3.47 虚拟光驱软件 DEAMON TOOLS 3.47 虚拟光驱软件 DEAMON TOOLS 3.47 虚拟光驱软件
swapd是一个动态交换创建守护进程,它监视系统内存并检测何时需要进行交换创建。 交换大小是根据sysadmin限制自动确定的
支持Vista系统的Deamon虚拟光驱
谷歌提供android 图片处理deamon,欢迎下载
linux daemon and zombie process