1. 介绍
如果守护进程有一配置文件,那么当该守护进程启动时,它读该文件,但是一旦启动后守护进程一般不会再去查看它。当系统管理员更改了配置文件,我们需要通知守护进程守护进程重读该文件。因为守护进程不与终端相结合,或者是无控制终端的会话首进程,或者是孤儿进程组的成员,所以守护进程并不期望接受SIGHUP信号。所以,我们可以利用SIGHUP信号实现配置文件重读。
2. 源程序
- #include <unistd.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/stat.h>
- #include <errno.h>
- #include <syslog.h>
- #include <signal.h>
- //重读配置文件
- void reloadfile()
- {
- /**/
- }
- //SIGTERM信号处理程序
- void sigterm(int signo)
- {
- syslog(LOG_INFO, "got SIGTERM, exiting");
- exit(0);
- }
- //SIGHUP信号处理程序
- void sighup(int signo)
- {
- syslog(LOG_INFO, "reloading configuration file");
- reloadfile();
- return;
- }
- //守护进程处理任务
- void daemon_proccess()
- {
- }
- //守护进程重读配置文件
- int main(int argc, char *argv[])
- {
- char *cmd;
- struct sigaction sa;
- //如果找到'/' 最后出现的地址,就去掉'/'
- if((cmd =strrchr(argv[0],'/')) == NULL)
- {
- cmd = argv[0];
- }
- else
- {
- cmd++;
- }
- //初始化一个守护进程
- daemonize(cmd);
- //如果守护进程已经在运行,则退出
- if(isAlreadRun())
- {
- syslog(LOG_ERR, "daemon already is running");
- exit(1);
- }
- //捕捉SIGTERM信号,调用处理程序
- sa.sa_handler = sigterm;
- sigemptyset(&sa.sa_mask);
- sigaddset(&sa.sa_mask, SIGTERM);
- sa.sa_flags = 0;
- if(sigaction(SIGTERM, &sa, NULL) < 0)
- {
- syslog(LOG_ERR, "can't catch SIGTERM : %s", strerror(errno));
- exit(1);
- }
- //捕捉SIGHUP信号,调用处理程序
- sa.sa_handler = sighup;
- sigemptyset(&sa.sa_mask);
- sigaddset(&sa.sa_mask, SIGHUP);
- sa.sa_flags = 0;
- if(sigaction(SIGHUP, &sa, NULL) < 0)
- {
- syslog(LOG_ERR, "can't catch SIGHUP : %s", strerror(errno));
- exit(1);
- }
- //守护进程处理任务
- daemon_proccess();
- exit(0);
- }