APUE第13章 守护进程

Daemon即守护进程。一般一直处于后台运行状态,没有控制终端。

编写Daemon程序的规则

  1. 用umask函数设置权限屏蔽字(通常为0)。
  2. 调用fork,然后父进程退出
  3. 调用setsid创建新会话
  4. 更改当前工作目录(通常改为根目录)
  5. 关闭不需要的文件描述符(getrlimit获取最大允许的文件描述符然后一个个关闭)
  6. 某些Daemon会打开/dev/null/使其具有文件描述符0、1和2,这样就不会有输入和输出的干扰

出错记录

  1. 内核的进程可以直接调用log函数
  2. 用户进程大多调用syslog产生日志
  3. 发送至UDP端口51
    1
    2
    3
    4
    5
    6
    //syslog的接口
    #include <syslog.h>
    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进程运行。