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

简介: 作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 在linux系统中的daemon,大都有reload configuration的功能,一般情况下通过发送SIGHUP给服务daemon,可以使daemon重新读取其配置文件,如Free Radius。
作者: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会覆盖前一个时间。
相关文章
|
6月前
|
存储 API Windows
10.0 探索API调试事件原理
本章笔者将通过`Windows`平台下自带的调试API接口实现对特定进程的动态转存功能,首先简单介绍一下关于调试事件的相关信息,调试事件的建立需要依赖于`DEBUG_EVENT`这个特有的数据结构,该结构用于向调试器报告调试事件。当一个程序发生异常事件或者被调试器附加时,就会产生对应的`DEBUG_EVENT`调试事件,通常`DEBUG_EVENT`包含了多种调试类型,包括异常事件、进程创建事件、线程创建事件、进程退出事件和线程退出事件等等,我们只需要动态捕捉这些调试事件并作相应的处理即可实现更多有用的功能。
60 1
10.0 探索API调试事件原理
|
8月前
|
缓存 JSON 程序员
良好的 API 设计指南
当用户请求获取一组对象列表时,你就需要对结果进行过滤并返回一组严格符合用户要求的对象。有时返回结果的数量可能非常大,但是你也不能随意对此进行约束,因为这种服务端的随意约束会造成第三方开发人员的困惑。如果用户请求了一个集合,并对返回结果进行遍历,然后只要前100个对象
|
8月前
|
存储 机器学习/深度学习 数据挖掘
API技术的使用场景
互联网的发展和普及,API技术也变得越来越重要。API是应用程序接口,它是一种连接不同应用程序或系统之间数据交换和通信的方式。API技术不仅提高了不同应用程序之间的互操作性,还加速了应用程序的开发和部署。本文将探讨API技术在不同场景下的应用。
|
8月前
|
架构师 测试技术 API
为什么要 API 优先?
最近关于 API-First (API 优先)作为设计和开发方法的讨论很多,虽然通向 API-First 的途径有很多,但通常推动 API-First 的一般都是 API 架构师、API 设计师和 API 平台负责人等,很好理解,因为他们对组织中 API 的效率、互操作性和质量最感兴趣。 因此,这些支持者制定了与团队其他成员共享的 API 指南和标准。对于开发人员来说,API 优先似乎是一个崇高目标,但实施该方法时动力和紧迫性经常会减弱。结果导致开发者可能难以遵守这些政策。 管理层关心 API 管理,那其他人为什么也应该关心呢?
56 0
|
API 开发工具 数据安全/隐私保护
如何调用 API | 学习笔记
简介:快速学习如何调用 API
981 0
如何调用 API | 学习笔记
|
10月前
|
Dubbo IDE 应用服务中间件
服务 API 设计之 ——API 参数规范
服务 API 设计之 ——API 参数规范
|
10月前
|
前端开发 测试技术 API
设计一个高质量的 API 接口
设计一个高质量的 API 接口
|
关系型数据库 OLAP API
调用 API|学习笔记
快速学习调用 API
123 0
调用 API|学习笔记
|
API
API如何设计
在之前《应对变化》[1]中提到模块之间合的策略:缩小依赖范围,API是两个模块间唯一的联结点
144 0
API如何设计
|
前端开发 JavaScript Java
如何更好管理 Api 接口(续)
哈喽,我是树酱。去年中旬的时候写过一篇关于如何更好管理 Api 接口。最近有朋友问我,我们都是根据Swagger文档,然后通过“阅读”swagger文档中每个微服务包含的CRUD(增刪查改)等API,再通过“手动”撸出各种service文件,以此达到封装的结果。但是这样会暴露一些问题,如下👇
555 0
如何更好管理 Api 接口(续)