首页 > 代码库 > 第二十三篇:信号机制的两个思考
第二十三篇:信号机制的两个思考
前言
前文介绍了最基本的信号接收和处理,但这有无可能带来一些问题呢?
本文将通过两个思考,来分析可能带来的问题以及解决方法。
思考一:中断的系统调用
如果用户正在执行系统调用,如 write read。如果这个时候程序跳转到了信号处理函数后返回,则是否重新执行这个系统调用?
结论
这要分情况讨论:如果是磁盘 I/O 的系统调用,则自然需要自动重启;而如果是终端 I/O,则不需要自动重启。
在信号函数族中,有很多函数都是支持设置是否重启选项的。当然,用户也可以使用类似下面的代码自行实现重启:
思考二:可重入函数
有些函数需要使用系统资源,比如 malloc 需要使用内存资源,那么当某个函数正在调用 malloc 的时候,如果系统进入了信号处理函数,而在这个处理函数中,如果再调用了 malloc,是不是会破坏掉原来函数中的数据呢?
结论
是的。因此,需要区分可重入函数和非可重入函数。下图中出现的函数都是可重入函数,没有在图中出现的则是非可重入函数:
第二十三篇:信号机制的两个思考
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。