作者: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会覆盖前一个时间。
阅读(578) | 评论(0) | 转发(0) |