APUE第13章 守护进程
编写Daemon程序的规则
- 用umask函数设置权限屏蔽字(通常为0)。
- 调用fork,然后父进程退出
- 调用setsid创建新会话
- 更改当前工作目录(通常改为根目录)
- 关闭不需要的文件描述符(getrlimit获取最大允许的文件描述符然后一个个关闭)
- 某些Daemon会打开/dev/null/使其具有文件描述符0、1和2,这样就不会有输入和输出的干扰
出错记录
- 内核的进程可以直接调用log函数
- 用户进程大多调用syslog产生日志
- 发送至UDP端口51
1
2
3
4
5
6//syslog的接口
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const chat *format, ...);
void closelog(void);
int setlogmask(int maskpri);
其中openlog和closelog都不是必须的,但是调用openlog可以指定ident,这样他会被加入每条日志中
单例守护进程
背景问题
有些进程需要单例运行,否则会引发其他冲突,比如cron的定时,如果同时运行多个cron的守护进程,可能设定的任务会被触发多次。
解决方案
创建一个独有的文件(一般为/var/run/name.pid,可能需要root权限)并给他加上写锁,如果失败则退出。这样能保证只有一个daemon进程运行。