信号捕捉与处理:信号捕捉的过程 + 信号处理函数(signal、sigaction)

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

一般情况下,我们进行系统调用以后,会有一个从用户态 向内核态的转换,等系统调用执行完以后,我们再从内核态返回到用户态,继续执行下一条语句。

现在我们要在这种情况下加入对信号的捕捉和处理过程,最关键的问题就是,什么时候处理最合适??答案是准备从内核态返回到用户态的时候!!(也就是执行完OS代码的时候


目录

一、信号捕捉的过程

1、没有收到信号或者信号被阻塞

2、收到了信号而且信号没有被阻塞

3、总结:进程处理信号时,用户态和内核态的转换过程

 二、信号处理函数

1、signal函数

2、sigaction函数

(1) 结构体 struct sigaction

(2) sigaction函数参数解析

(2) 小测试:使用sigaction函数,附加处理信号时,屏蔽2号信号


一、信号捕捉的过程

我们依然以我们熟悉的printf函数为例,打印内容时,实际上会执行系统调用,转换成内核态向stdout文件写入内容,写入完毕以后,我们需要先进行信号检测!!

1、没有收到信号或者信号被阻塞

执行完OS代码,我们会先进行信号检测,怎么检测呢?检查pending表,这个我们在信号保存部分已经介绍了。通过pending表我们可以知道,是否收到了信号,如果没有,那就直接返回用户态,执行下一句代码

2、收到了信号而且信号没有被阻塞

现在信号收到了,假设收到的是2号信号,pending表里的第二个位置就会变成1

执行完OS代码以后,检查pending表,发现收到了信号,然后检查block表,如果2号信号被阻塞了,就会像上面直接返回到用户态;如果没有被阻塞,那就会去执行对应的处理函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值