阻塞信号
信号相关概念
- 实际执行信号的处理动作称为信号递达(Delivery)
- 信号从产生到递达之间的状态,称为信号未决(Pending)。[收到信号但是没有处理]
- 进程可以选择阻塞 (Block )某个信号。
- 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.
- 注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。
忽略和阻塞处理的区别:
忽略代表信号已经抵达,并且处理了,处理的方式就是什么都不干。而阻塞则信号压根没有被递达。阻塞的信号如果不解除阻塞的话永远不会被递达,只有解除阻塞才可以。
由上面的概念我们可以得出pcb内部其实由3张表
对padding的修改代表是否收到了信号,以及收到了什么信号。handler 是函数指针,代表着各个信号的实现方法。 自定义信号捕捉,就是把自己的函数处理方式填到handler里面。
在信号处理的时候方法是直接调用的吗?
NO对于我们传入的参数,他会先进行强制类型转换,如果等于1,执行默认行为,等于2忽略,都不等于才会执行调用对应的方法。
block表也是一个位图结构和padding一模一样。唯一的差别是位图中的内容代表信号是否被阻塞。
一个信号被处理的过程
操作系统修改padding位图,然后查找block表看是否被阻塞,然后进入对应的handler表执行处理方法。
sigset_t
每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多