使用alarm API实现灵活的延时操作

作者: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会覆盖前一个时间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值