APUE学习笔记六——守护进程
04 September 2014
守护进程没有控制终端,所以说它们是在后台运行的,其终端名设置为问号。
大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。
用户层守护进程的父进程是init进程。
编程规则
- 调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0);
- 调用fork,然后使父进程exit。这样做实现了以下几点。第一,如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止会让shell认为这条命令已经执行完毕。第二,虽然子进程继承了父进程的进程组ID,但获得了一个新的进程ID,这就保证了子进程不是一个进程组的组长进程。这是下面将要进行的setsid调用的先决条件。
- 调用setsid创建一个新会话。发生:a、成为新会话的首进程b、成为一个新进程组的组长进程c、没有控制终端。
- 将当前工作目录更改为根目录或某个合适的位置。
- 关闭不需要的文件描述符。
- 某些守护进程打开/dev/null使其具有文件描述符0、1和2,这样,任何一个试图读标准输入、写标准输出或标准错误输出的操作都不会产生任何效果。
出错记录
- 发送日志给syslogd
- 自己写日志文件
单实例守护进程
为了正常运作,某些守护进程会实现为,在任一时刻只运行该守护进程的一个副本。
如果每一个守护进程创建一个有固定名字的文件,并在该文件的整体上加一把写锁,那么只允许创建一把这样的锁。在此之后创建写锁的尝试都会失败,这向后续守护进程副本指明已有一个副本正在运行。
守护进程的惯例
- 若守护进程使用锁文件,那么该文件通常存储在/var/run目录中,锁的文件名通常是name.pid;
- 若守护进程支持配置选项,那么配置文件通常存储在/etc目录中,配置文件名通常是name.conf;
- 守护进程可用命令行启动;
- 若一个守护进程有一个配置文件,当该文件被修改后,那么最好发送信号给守护进程,让其重度配置文件。