Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8029535
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: LINUX

2011-03-07 22:10:36

作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net

在linux系统中的daemon,大都有reload configuration的功能,一般情况下通过发送SIGHUP给服务daemon,可以使daemon重新读取其配置文件,如Free Radius。

当我们为Radius包装一层功能时,比如通过web对radius进行配置。为了方便用户的使用,肯定需要在用户对radius的配置进行更改以后,给radiusd发送SIGHUP通知reload。不过,在实际的使用过程中,用户往往不是只修改一个配置,往往是有大量配置的修改。如果每次都重启radiusd进程,无疑是没有必要的,且会降低系统的反应和处理速度。

那么我们可以使用延时reload的功能,比如修改一个配置后,通知radius五秒以后reload。如果在这5秒期间,仍然有其它改动,那么在从改动点顺延5秒,直至5秒内没有任何配置,再让radius reload其配置文件。

根据这个需求,我们需要修改radius的SIGHUP的信号处理函数。当收到一个SIGHUP时,需要启动一个定时器。并且当再次收到SIGHUP时,修改已有的定时器,重置其定时间隔5秒钟。从上面的描述上看,没有几十行代码时完不成这个需求的,并且还有引入bug的可能性。

但是如果我们使用alarm的话,可以用几行代码完成这个功能。步骤如下:
1. 修改SIGHUP的信号处理函数,在信号处理函数中调用alarm(RADIUS_DELAY_RELOAD_TIME),其中RADIUS_DELAY_RELOAD_TIME为5;
2. 把原来的SIGHUP信号处理函数(处理reload功能),作为SIGALRM的信号处理函数。

好了,这样,仅仅通过大概5行的代码就完成了上述需求。这里,利用的就是alarm的一个特性,当前一次alarm设定的时间没有到期时,再次调用alarm会覆盖前一个时间。
阅读(5434) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~