守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进 程。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。 比如,作业规划进程crond,打印进程lpd等。
守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同 Unix环境下守护进程的编程规则并不一致。需要注意,照搬某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。下面将给出Linux下守护进程的编程要点和详细实例。
一. 守护进程及其特性
守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环 境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下 来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还 可以由用户终端(通常是 shell)执行。
总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。如果对进程有比较深入的认识就更容易理解和编程了。
二. 守护进程的编程要点
前面讲过,不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样,区别在于具体的实现细节不同。这个原则 就是要满足守护进程的特性。同时,Linux是基于Syetem V的SVR4并遵循Posix标准,实现起来与BSD4相比更方便。编程要点如下;
1. 在后台运行。
为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。
if(pid=fork())
exit(0); //是父进程,结束父进程,子进程继续
2. 脱离控制终端,登录会话和进程组
有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长:
setsid();
说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。
3. 禁止进程重新打开控制终端
现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
if(pid=fork()) exit(0); //结束第一子进程,第二子进程继续(第二子进程不再是会话组长)
4. 关闭打开的文件描述符
进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们:
for(i=0;i 关闭打开的文件描述符close(i);>
5. 改变当前工作目录
进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如 /tmpchdir("/")
6. 重设文件创建掩模
进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0);
7. 处理SIGCHLD信号
处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结 束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。
signal(SIGCHLD,SIG_IGN);
这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。
三. 守护进程实例
守护进程实例包括两部分:主程序test.c和初始化程序init.c。主程序每隔一分钟向/tmp目录中的日志test.log报告运行状态。初始化程序中的init_daemon函数负责生成守护进程。读者可以利用init_daemon函数生成自己的守护进程。
1. init.c清单
#include < unistd.h >
#include < signal.h >
#include < sys/param.h >
#include < sys/types.h >
#include < sys/stat.h >
void init_daemon(void)
{
int pid;
int i;
if(pid=fork())
exit(0);//是父进程,结束父进程
else if(pid< 0)
exit(1);//fork失败,退出
//是第一子进程,后台继续执行
setsid();//第一子进程成为新的会话组长和进程组长
//并与控制终端分离
if(pid=fork())
exit(0);//是第一子进程,结束第一子进程
else if(pid< 0)
exit(1);//fork失败,退出
//是第二子进程,继续
//第二子进程不再是会话组长
for(i=0;i< NOFILE;++i)//关闭打开的文件描述符
close(i);
chdir("/tmp");//改变工作目录到/tmp
umask(0);//重设文件创建掩模
return;
}
2. test.c清单
#include < stdio.h >
#include < time.h >
void init_daemon(void);//守护进程初始化函数
main()
{
FILE *fp;
time_t t;
init_daemon();//初始化为Daemon
while(1)//每隔一分钟向test.log报告运行状态
{
sleep(60);//睡眠一分钟
if((fp=fopen("test.log","a")) >=0)
{
t=time(0);
fprintf(fp,"Im here at %sn",asctime(localtime(&t)) );
fclose(fp);
}
}
}
以上程序在RedHat Linux6.0下编译通过。步骤如下:
编译:gcc -g -o test init.c test.c
执行:./test
查看进程:ps -ef
从输出可以发现test守护进程的各种特性满足上面的要求。
相关推荐
学习编写Linux守护进程是提升系统编程技能的重要部分,这有助于理解系统如何在后台执行服务并保持系统的稳定性。这份资料"linux-deamon-programming.zip"提供了一个很好的起点,你可以通过阅读和实践其中的内容来...
虚拟光驱.听说现在居然收费了...
《DeamonTools4.12.1:虚拟光驱技术详解及应用》 Deamon Tools是一款广受欢迎的虚拟光驱软件,其4.12.1版本为用户提供了高效便捷的光盘映像处理功能。在数字化存储日益普及的时代,虚拟光驱软件如Deamon Tools已经...
最新汉化Deamon4.3 (支持Viata) 现在网上有很多游戏和软件都做成了ISO或者CCD等镜像格式,有些游戏,比如大宇出品的轩辕剑,大富翁7等游戏,由于游戏盘是加密的,所以镜像文件只能做成mds格式的。当你辛辛苦苦下载...
标题中的“虚拟光驱DEAMON”指的是DEAMON Tools,这是一个非常著名的虚拟光驱软件。虚拟光驱软件允许用户在计算机上创建虚拟驱动器,这些驱动器可以模拟实际的CD或DVD驱动器,但无需物理介质。DEAMON Tools是这类...
在标签中提到的“daemon”和“deamon_tools”,实际上是对软件名称的英文拼写变体,"daemon"是英文中代表“守护进程”的意思,在这里是指后台运行的服务程序,即Daemon Tools在后台默默工作,为用户提供虚拟光驱服务...
Linux 下使用 QT 开发 Daemon 程序 本文将介绍如何使用 QT 框架在 Linux 系统下开发 Daemon 程序。Daemon 程序是一种特殊的进程,它运行于后台,不受终端控制。使用 QT 框架可以方便地开发 Daemon 程序。 首先,让...
最新最好用的虚拟光驱,就是Deamontools advanced 5.2 只用最新版
DEAMON Tools Pro是一款在IT行业内广泛使用的专业虚拟光驱软件,它的全称可能是"DAEMON Tools Pro Advanced"。这款工具允许用户创建虚拟光驱,从而在计算机上模拟实际光盘的功能,而无需物理光盘。它对于那些频繁...
《虚拟光驱软件Daemon Tools 3.47的回顾与技术解析》 Daemon Tools是一款历史悠久的虚拟光驱软件,尤其以其3.47版本在用户群中享有极高口碑。这款软件在早期因其轻巧的体积、高效的功能以及免费的特性,深受广大...
live_deamon.dllC++版本的数据集里面如果某一个样本的某一个特征为0,这个特征可以不写在数据集中,但是在matlab版本中
一个不错的虚拟光驱工具,支持Win9x/win2k,支持ps,支持加密光盘,装完不需启动即可用。是一个先进的模拟备份并且合并保护盘的软件,可以备份SafeDisc保护的软件,可以打开CUE,ISO and CCD 等这些虚拟光驱的镜像...
"Deamon Tools虚拟光驱"是一款著名的虚拟光驱软件,被广泛用于计算机用户之中,尤其在游戏、软件安装和系统维护领域。它以其强大的功能和易用性赢得了用户的喜爱。这款软件的核心作用在于,它可以在计算机上模拟创建...
"我的deamon 传动系"这个标题可能是指一个与守护进程(Daemon)相关的软件系统...以上是对"我的deamon 传动系"主题的详细解读,结合了守护进程的基本概念、管理和调试方法,以及Foxit Software在服务背景下的可能应用。
9. **Unlock功能**:在提供的压缩包文件"DAEMON Tools Lite v10.4.0.190 Unlock"中,可能包含了解锁某些高级特性的密钥或方法,让用户能体验到更多虚拟光驱的功能。 10. **安全可靠**:Deamontools是经过广泛测试和...
三、DEAMON TOOLS 3.47的使用方法 1. **安装**:下载并运行DEAMON tools 3.47.exe文件,按照提示进行安装。 2. **创建虚拟驱动器**:安装完成后,软件会自动识别可用的物理光驱,并在系统托盘区显示图标。右键点击...
其全称是Very Secure FTP Deamon,在安全性、速度和稳定性方面都有着不俗的表现。 在安全性方面,Vsftpd针对程序的权限来设计,以一般身份启动服务,对Linux系统的使用权限较低;在千兆以太网上,Vsftpd的速度可以...
总之,解决“mysql deamon failed to start”错误需要耐心地分析日志、检查配置和权限,并可能涉及到对Linux系统的深入理解。在处理这类问题时,保持冷静,按照步骤逐步排查,通常都能找到合适的解决方案。同时,...
总的来说,这个压缩包提供了一种在PHP 5.6环境下利用Composer管理和运行后台服务的方法。用户可以通过提供的工具和说明来安装服务,确保PHP持续运行,并且能够方便地管理项目依赖。这对于开发需要后台持续运行的PHP...
Deamon Tools是一款备受推崇的虚拟光驱软件,尤其适用于那些需要频繁处理光盘镜像的用户,如游戏爱好者、系统管理员以及软件开发者。这个压缩包"Deamon Tools4.03.rar"包含了该软件的旧版本4.03,它支持多种操作系统...