原:http://hi.baidu.com/%CD%F5%C6%BD1988/blog/item/aa3e3e3de01c530cbba167a2.html 

Deamon进程首先也是一个进程,但是与一般的进程又有一些区别。一般来说,Deamon进程的生命周期通常很长,并且在系统中只会存在一个实例。此外,Deamon进程都是最为后台进程来运行的,他们会周期性的执行一些操作。其中系统级(运行在kernel mode)的deamon进程都是不与具体的控制终端关联的。当然用户级的deamon进程也是与终端不关联的,这可以通过setsid系统调用来实现。一般来说,deamon进程的父进程都是init进程。

下面讲讲编程deamon程序的规则:

1.首先要做的事情就是调用umask函数设置file mode creation mask为0。因为继承的file mode creation mask可能会被设置成某种权限。如果deamon进程需要创建文件,他也许会要求设置某些具体的权限。

2.调用fork然后让父进程推出。这样做是出于某些目的的。首先,如果deamon进程是用一个简单的命令行启动的,让父进程推出会使得shell认为这个command line执行完毕。第二,子进程继承了父进程的进程组id,但是自己会得到一个新的process id,这样就可以确保子进程不是一个process group leader,而这正是调用setsid的前提。

3.调用setsid来创建一个新的session。这样调用进程就成为新session的leader,新进程组的leader,并且没有controlling terminal与之关联。

4.把当前的工作目录改变到root目录。从父进程继承过来的cwd可能被夹在在文件系统上。因为deamon进程通常到系统关机的时候才会停止,所以这会使得文件系统不能被卸载。

5.不需要的文件文件描述符必须被关掉。这样可以防止Deamon进程始终占有父进程打开的文件。

6.一些deamon进程把打开的文件描述符0,1,2都重定向到/dev/null,这样所有库程序想从标准输入读数据或者向标准输出写数据都会没有效果。

有时候有些Deamon进程必须是单实例的,也就是说任何时刻只能运行该程序的一个实例。文件锁和记录锁机制可以提供一个方便的互斥机制。

UNIX Deamon进程的一些惯例:

1.如果Deamon进程需要使用锁文件,那么这个锁文件一般存放在/var/run目录下面。但是这时候Deamon进程可能会需要超级权限来创建一个文件。文件名通常是name.pid,其中的name就是Deamon进程的名字。

2.如果Deamon进程支持配置选项,那么他们通常是存放在/etc目录下面的。配置文件名字是name.conf。

3.Deamon进程可以从命令行启动,但是更常见的是从系统初始化脚本(/etc/rc*   /etc/init.d/*)中启动的。

4.如果一个Deamon进程有一个配置文件,通常他只在启动的时候读取配置文件,之后通常不在读取该文件。但是可以重载SIGHUP信号来使它重新加载配置文件。