1.守护进程的特征
守护进程也称精灵进程是生存期长的一种进程,它们常常在系统引导装入时启动,在系统管比时终止。守护进程没有控制终端,所以它们是在后台运行的。守护进程是一种很有用的进程。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。
所有守护进程都以超级用户(用户ID为0)的优先权运行。没有一个守护进程具有控制终端,控制名称设置为(?)、终端前台进程组ID设置为-1。除update以外的所有守护进程都是组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。所以的守护进程的父进程都是init进程。
守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。
2.编程规则
1).首先做的是调用fork,然后使父进程exit
2).调用setsid以创建一个新对话期
3).将当前工作目录更改为根目录
4).将文件方式创建屏蔽字设置为0
5).关闭不再需要的文件描述符
6).某些守护进程打开/dev/null使其具有文件描述符0,1,2,这样,任何一个试图读标准输入、写标准输出或标准出错的库历程都不会产生任何效果。
3.出错记录
大多数守护进程使用syslog设施(守护进程出错记录措施)。下图显示了syslog设施的详细组织结构。
该设施的接口函数:
#include <syslog.h> void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void); int setlogmask(int maskpri); //返回之前日志优先级掩码值。
4.守护进程的惯例
1).如果守护进程使用一个锁文件,那么文件通常存储在/var/run目录下。
2).如果守护进程支持配置选项,那么它们通常被存储在/etc目录中。
3).守护进程可以通过命令行启动,但是通常它们是由系统初始化脚本之一(/etc/rc*或/etc/init.d/*)启动的
4).如果一守护进程有一个配置文件,那么当该守护进程启动时,它读该文件,但是此之后一般就不会再次查看它