一般情况下,我们进行系统调用以后,会有一个从用户态 向内核态的转换,等系统调用执行完以后,我们再从内核态返回到用户态,继续执行下一条语句。
现在我们要在这种情况下加入对信号的捕捉和处理过程,最关键的问题就是,什么时候处理最合适??答案是准备从内核态返回到用户态的时候!!(也就是执行完OS代码的时候)
目录
(2) 小测试:使用sigaction函数,附加处理信号时,屏蔽2号信号
一、信号捕捉的过程
我们依然以我们熟悉的printf函数为例,打印内容时,实际上会执行系统调用,转换成内核态向stdout文件写入内容,写入完毕以后,我们需要先进行信号检测!!
1、没有收到信号或者信号被阻塞
执行完OS代码,我们会先进行信号检测,怎么检测呢?检查pending表,这个我们在信号保存部分已经介绍了。通过pending表我们可以知道,是否收到了信号,如果没有,那就直接返回用户态,执行下一句代码

2、收到了信号而且信号没有被阻塞
现在信号收到了,假设收到的是2号信号,pending表里的第二个位置就会变成1
执行完OS代码以后,检查pending表,发现收到了信号,然后检查block表,如果2号信号被阻塞了,就会像上面直接返回到用户态;如果没有被阻塞,那就会去执行对应的处理函数

这个时候要注意,执行完处理函数不是直接就去执行用户代码的下一句了!!我们必须要保证,最后返回到用户态的时候,是从内核态返回到用户态的!!执行完处理函数,我们要先返回到内核态,然后执行sys_sigreturn()函数来返回到用户态


本文详细阐述了系统调用中的信号处理过程,关键在于从内核态返回用户态时处理信号。讲解了signal和sigaction函数在信号捕获与处理中的应用,并通过实例演示了如何使用sigaction屏蔽特定信号。
最低0.47元/天 解锁文章
2613

被折叠的 条评论
为什么被折叠?



