Linux网络编程 | 统一事件源的实现

  • A+
所属分类:C程序设计

信号是一种异步事件:信号处理函数和程序的主循环是两条不同的执行路线。很显然,信号处理函数需要尽可能快地执行完毕,以确保该信号不被屏蔽(为了避免一些竞态条件,信号在处理期间,系统不会再次触发它)太久。

一种典型的解决方案是:把信号的主要处理逻辑放到程序的主循环中,当信号处理函数被触发时,它只是简单地通知主循环程序接收到信号,并把信号值传递给主循环主循环再根据接收到的信号值执行目标信号对应的逻辑代码

信号处理函数通常使用管道来将信号“传递”给主循环:信号处理函数向管道的写端写入信号值,主循环则从管道的读端读出该信号值

那么主循环怎么知道管道上何时有数据可读呢?这很简单,我们只需要使用I/O复用系统调用来监听管道的读端文件描述符上的可读事件。如此一来,信号事件就能和其他I/O事件一样被处理,即统一事件源。如下图所示:
在这里插入图片描述
很多优秀的 I/O 框架库和后台服务器程序都统一处理信号和 I/O 事件,比如 Libevent I/O 框架库和 xinetd 超级服务。

下面我们给出了统一事件源的一个简单实现,程序只是简单的读取 Ctrl + C 信号,将其信号值打印屏幕上,并结束程序。但实际中,我们可以根据需要,将不同的信号指向不同的处理逻辑。

运行上述程序,当我们按下 ctrl + c 后,可以看到程序打印出了信号值,并结束。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  1

    • bloodzer0 bloodzer0 Admin

      你好,在csdn上我看到你很多关于大数据安全相关的文章,想加你好友,不知道能否交换一下微信;Lzero2012