daemon编程小结- -
一.daemon的特点
必须由root启动。它是非交互式程序,所以没有控制中断,无须用户输入。不能控制终端,所以无任何输出,因此无论是向stderr还是stdout都需做特别处理。通常作为进程组和会话的领导进程。父进程是init,因为真正的父进程fork以后就exit了,是由init继承的孤儿进程。
二.编写daemon时该遵循的步骤
1.在父进程中执行fork后exit;
2.在子进程中调用setsid;//创建新的会话和进程组,消除新进程与任何控制终端的关联
3.让‘/’目录成为子进程的工作目录;//防止其他程序想卸载某个文件系统时由于daemon的占用而导致失败
4.把子进程的umask变为0;//避免守护进程继承的umask受到创建文件和目录操作的干扰
5.关闭任何不需要的文件描述符;
6.做任何你想做的。
三.相关函数调用
1.fork;
2.setsid;
3.chdir;
4.umask。
四.出错处理
由于daemon调用setsid后不再有控制终端,所以也无法向stdout和stderr输出。可通过源自BSD的syslog服务,系统日志守护进程syslogd提供这一服务。
相关接口原型:
#include <syslog.h>
void openlog(char *ident, int option, int facility);
void closelog(void);
void syslog(int priority, char *format, ...);
linux下日志文件通常为/var/log/messages。
如果使用了syslog服务,daemon中可以将自己定义的消息写入自己定义的文件,但daemon产生的所有出错信息都记录到系统日志中。
五.和守护进程通信
1.读取配置文件
使用open、read调用或标准库里的fopen、fread,注意将错误信息写入日志。
2.加入信号处理功能
通过kill向daemon发送信号,在daemon中加入响应该信号的相应代码,代码中可以做你想做的任何事:例如重新读取配置文件。这样就可以控制动态daemon的行为了。