https://www.cnblogs.com/Carrie-0173/p/6394533.html
</h1>
<div class="clear"></div>
<div class="postBody">
当要处理信号捕捉问题时,我们可以为某一信号设置自定义的信号处理函数,这个信号处理函数会对正在执行的进程有怎样的影响?
一、对进程执行的干预:
1.当信号被捕捉时,进程正在执行用户态程序指令,(即用户自行编写的代码 或 库程序代码):
此种情况下,进程正执行的代码将被暂停,转而去执行信号处理函数。只要信号处理函数中 不 exit()终止当前进程 或 用longjmp跳转到别的地方,那么当信号处理函数执行完成后,进程将继续从被信号中断处开始执行。
2.当信号被捕捉时,进程正在执行核心态代码,(系统调用-内核代码):
此时,除非系统调用结束,或者 调用了sleep原语进行睡眠(且非快速I/O的短暂睡眠)让出CPU时,信号处理函数才可执行,否则信号处理函数无法打断进程当时的执行。
二、易导致的问题
当信号处理函数打断了进程当时的代码执行,进行了其它的操作,这很容易导致代码重入的问题,尤其对那些依赖全局或静态数据结构的算法操作影响很大。
比如:
char *strtok(char *string,char *token)函数,用于根据给定的分解符token,从给定的字符串string中分出一个单词。返回指向单词的首字符指针。
当第一个参数为NULL时,strtok函数将在上一次执行该函数结束的位置(第一个被分出的单词的尾部)继续寻找下一个单词。
这个功能是根据strtok函数内部使用了静态变量记录了上次的结束位置。
如果strtok函数当第一个参数为NULL时的执行被信号处理函数中止,而且信号处理函数中也使用了strtok函数,那么当进程返回到被中断前的strtok函数执行时,就会出现错误,因为依赖的全局变量被改变了。
信号处理函数带来的代码重入问题,在调试中很困难,因为信号到达时间是有一定随机性的(不好控制),所以错误重现很困难。所以我们在编程时,尽量不要用信号机制实现过分复杂的功能。
<div class="clear"></div>
<div id="post_next_prev">
<a href="https://www.cnblogs.com/Carrie-0173/p/6365105.html" class="p_n_p_prefix">« </a> 上一篇: <a href="https://www.cnblogs.com/Carrie-0173/p/6365105.html" title="发布于 2017-02-04 15:23">堆栈的三种实现方式</a>
<br>
<a href="https://www.cnblogs.com/Carrie-0173/p/6395398.html" class="p_n_p_prefix">» </a> 下一篇: <a href="https://www.cnblogs.com/Carrie-0173/p/6395398.html" title="发布于 2017-02-13 21:10">函数模板与类模板</a>
【推荐】开发者上云福利,腾讯云1核4G云服务器11元/月起
【推荐】开年盛典,百度智能云1核1G云服务器84元/年