1. 介绍
如果守护进程有一配置文件,那么当该守护进程启动时,它读该文件,但是一旦启动后守护进程一般不会再去查看它。当系统管理员更改了配置文件,我们需要通知 守护进程守护进程重读该文件。因为守护进程不与终端相结合,或者是无控制终端的会话首进程,或者是孤儿进程组的成员,所以守护进程并不期望接受 SIGHUP信号。所以,我们可以利用SIGHUP信号实现配置文件重读。
2. 源程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#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); } |
发表评论
要发表评论,您必须先登录。