守护进程之重读配置文件

 1. 介绍

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

2. 源程序

 

  1. #include <unistd.h>  
  2. #include <fcntl.h>  
  3. #include <stdio.h>  
  4. #include <string.h>  
  5. #include <stdlib.h>  
  6. #include <sys/stat.h>  
  7. #include <errno.h>  
  8. #include <syslog.h>  
  9. #include <signal.h>  
  10. //重读配置文件  
  11. void reloadfile()  
  12. {  
  13.     /**/  
  14. }  
  15.  //SIGTERM信号处理程序  
  16. void sigterm(int signo)  
  17. {  
  18.     syslog(LOG_INFO, "got SIGTERM, exiting");  
  19.     exit(0);  
  20. }  
  21.  //SIGHUP信号处理程序  
  22. void sighup(int signo)  
  23. {  
  24.     syslog(LOG_INFO, "reloading configuration file");  
  25.     reloadfile();  
  26.     return;  
  27. }  
  28. //守护进程处理任务  
  29. void daemon_proccess()  
  30. {  
  31. }  
  32. //守护进程重读配置文件  
  33. int main(int argc, char *argv[])  
  34. {  
  35.     char *cmd;  
  36.     struct sigaction sa;  
  37.     //如果找到'/' 最后出现的地址,就去掉'/'  
  38.     if((cmd =strrchr(argv[0],'/')) == NULL)  
  39.     {  
  40.         cmd = argv[0];  
  41.     }  
  42.     else  
  43.     {  
  44.         cmd++;  
  45.     }  
  46.     //初始化一个守护进程  
  47.     daemonize(cmd);  
  48.     //如果守护进程已经在运行,则退出  
  49.     if(isAlreadRun())  
  50.     {  
  51.         syslog(LOG_ERR, "daemon already is running");  
  52.         exit(1);  
  53.     }  
  54.     //捕捉SIGTERM信号,调用处理程序  
  55.     sa.sa_handler = sigterm;  
  56.     sigemptyset(&sa.sa_mask);  
  57.     sigaddset(&sa.sa_mask, SIGTERM);  
  58.     sa.sa_flags = 0;  
  59.     if(sigaction(SIGTERM, &sa, NULL) < 0)  
  60.     {  
  61.         syslog(LOG_ERR, "can't catch SIGTERM : %s", strerror(errno));  
  62.         exit(1);  
  63.     }  
  64.     //捕捉SIGHUP信号,调用处理程序  
  65.     sa.sa_handler = sighup;  
  66.     sigemptyset(&sa.sa_mask);  
  67.     sigaddset(&sa.sa_mask, SIGHUP);  
  68.     sa.sa_flags = 0;  
  69.     if(sigaction(SIGHUP, &sa, NULL) < 0)  
  70.     {  
  71.         syslog(LOG_ERR, "can't catch SIGHUP : %s", strerror(errno));  
  72.         exit(1);  
  73.     }  
  74.     //守护进程处理任务  
  75.     daemon_proccess();  
  76.     exit(0);  
  77. }  

http://blog.csdn.net/wzhwho/archive/2009/02/21/3918260.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值