守护进程之重读配置文件

文章出处:http://blog.csdn.net/wzhwho/archive/2009/02/21/3918260.aspx

 

1. 介绍

     如果守护进程有一配置文件,那么当该守护进程启动时,它读该文件,但是一旦启动后守护进程一般不会再去查看它。当系统管理员更改了配置文件,我们需要通知守护进程守护进程重读该文件。因为守护进程不与终端相结合,或者是无控制终端的会话首进程,或者是孤儿进程组的成员,所以守护进程并不期望接受SIGHUP信号。所以,我们可以利用SIGHUP信号实现配置文件重读。

 

2. 源程序

 

view plaincopy to clipboardprint? #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); }

你可能感兴趣的:(struct,cmd,File,null,任务,终端)