守护进程也称为精灵进程,是生存期较长的一种进程,它们常常在系统自举时启动,仅在系统关闭时才终止,因为它们没有控制终端,所以说它们是在后台运行的,unix系统有很多的守护进程,它们执行日常事务活动。
本章说明守护进程的结构,已以及如何编写守护进程程序,因为守护进程没有控制终端,我们需要了解在出现问题时,守护进程如何报告错误情况。
守护进程的编写规则:
在编写守护进程程序时需要遵循一些基本的规则,以便防止产生并不需要的交互作用,下面先说明这些规则,然后给出一个按照这些规则编写的函数daemonize
首先要做的是调用umask将文件模式创建屏蔽字设置为0,由继承得来的文件模式创建屏蔽字可能会拒绝设置某些权限,
2,调用fork,然后使父进程退出,这样做实现以下几点,如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为这条命令已经执行完毕,第二,子进程继承了父进程的进程组ID,但具有一个新的进程ID,这就保证了,子进程不是一个进程组的组长进程,这对于下面就要做的setsid调用是必要的前提条件。
3,调用setsid以创建一个新的会话,使得调用进程称为新会话的首进程,称为一个新进程组的组长进程,没有控制终端,
4,将当前工作目录更改为根目录,
5,关闭不再需要的文件描述符,这使守护进程不再持有从其父进程继承而来的某些文件描述符,(父进程可能为shell或其他 进程),
6,某些守护进程打开/dev/null,使其具有文件描述符0,1,2,这样,任何一个试图读标准输入,写标准输出,或标准出错,的库例程都不会产生任何效果。