守护进程

守护进程(daemon process)常用于执行操作系统的日常工作。由于守护进程没有终端,因此,我们说守护进程运行在后台中。

建立守护进程时,需要按顺序执行下列操作

  • 调用unmask操作,设置文件权限掩码(file mode creation mask)为0。
  • 调用fork操作,使父进程退出。
  • 调用setsid建立一个新会话。
  • 设置当前工作目录为根目录。
  • 关闭不必要的文件描述符。
  • 设置文件描述符0、1、2至/dev/null。

因为守护进程中标准输入输出流以及标准错误输出流被设置为null,无法使用标准IO流对守护进程记录错误信息。如果每一个守护进程将错误信息记录在不同的文件中,会为系统的维护带来不必要的麻烦,因此,Unix操作系统提供了syslog系列函数,用于将日志信息记录至/dev/log文件中。其函数原型如下

#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 msakpri);        //返回原先的掩码值。

openlog函数用于指定日志格式及日志来源,ident参数用于指示每条日志文件前需要显示的内容,option参数用于设置日志参数,facility参数用于指示日志来源。

syslog函数用于以某种格式发送日志信息。参数priority用于指示日志来源。

setmask可以组织某种来源的信息被发送至日志中。

如果某条信息被连续多次发送至日志中,日志文件会在该信息后注明重复N次,而不是直接将信息写入N次。

 

一般而言,同样的守护进程需要互斥,即,不允许相同程序以守护进程的形式在同一时间运行多次。守护进程的互斥行为以对同名文件的互斥操作实现,文件的互斥可以由文件锁来保持,守护进程开始时,对文件加锁,守护进程结束时对文件解锁。在文件被锁定的过程中,同名守护进程无法正确运行。该文件存储于/var/run目录下,命名方式为name.pid,name为守护进程的进程名称。

如果守护进程需要读取配置文件,则该文件存储于/etc目录下,文件名为name.conf。一般而言,配置文件仅被守护进程在进程开始时读取一次,如果配置文件被修改,需要重启守护进程才能使修改生效。重启守护进程可以通过向守护进程发送SIGHUP信号来实现。选用SIGHUP信号是因为,从理论上来说,守护进程在任何时候都不应该能够接收到由系统自行发出的SIGHUP信号。

需要在系统启动时自动执行的守护进程保存在/etc/rc*或/etc/init.d/*目录下。

 

posted @ 2012-09-16 16:17  o0慢节奏0o  阅读(402)  评论(0编辑  收藏  举报