第二十三篇:信号机制的两个思考

Posted 穆晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二十三篇:信号机制的两个思考相关的知识,希望对你有一定的参考价值。

前言

       前文介绍了最基本的信号接收和处理,但这有无可能带来一些问题呢?

       本文将通过两个思考,来分析可能带来的问题以及解决方法。

思考一:中断的系统调用

       如果用户正在执行系统调用,如 write read。如果这个时候程序跳转到了信号处理函数后返回,则是否重新执行这个系统调用

结论

       这要分情况讨论:如果是磁盘 I/O 的系统调用,则自然需要自动重启;而如果是终端 I/O,则不需要自动重启。

       在信号函数族中,有很多函数都是支持设置是否重启选项的。当然,用户也可以使用类似下面的代码自行实现重启:

       

思考二:可重入函数

       有些函数需要使用系统资源,比如 malloc 需要使用内存资源,那么当某个函数正在调用 malloc 的时候,如果系统进入了信号处理函数,而在这个处理函数中,如果再调用了 malloc,是不是会破坏掉原来函数中的数据呢?

结论

       是的。因此,需要区分可重入函数和非可重入函数。下图中出现的函数都是可重入函数,没有在图中出现的则是非可重入函数:

       

以上是关于第二十三篇:信号机制的两个思考的主要内容,如果未能解决你的问题,请参考以下文章

QT开发(十三)——QT信号与槽机制

第二十二篇:信号的接收和处理

进程管理(二[2])

第二十三篇 责任与义务

第二十三篇 logging模块(******)

进程管理(二[2])