阻塞信号&捕捉信号
一. 阻塞信号
1. 信号的常见其他概念
实际执行信号的处理动作(3种)称为信号递达;
信号从产生到递达之间的状态,叫做信号未决;
进程可以选择阻塞某个信号;
被阻塞的信号产生时,将保持在未决状态,直至进程取消对该信号的阻塞,才执行递达的动作;
注意:阻塞和忽略是不同的。只要信号阻塞就不会被递达;而忽略是信号在递达之后的一种处理方式。
2. 在内核中的表示
信号在内核中的表示示意图:

每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针(handler)表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直至信号递达才清除该标志。
操作系统向进程发送信号就是将pending位图中的该信号对应状态位由0变为1。
如上图,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作;SIGINT信号产生过,但是正在被阻塞,所以暂时递达不了。虽然它的处理动作是忽略,但是未解除阻塞时不能忽略该信号,因为经常仍有机会改变处理动作后再解除阻塞;SIGQUIT信号未产生过,但是它是阻塞的,所以一旦该信号产生它就被阻塞无法递达,它的处理动作也是用户自定义函数。
在Linux下,如果进程解除某信号的阻塞之前,该信号产生了很多次,它的处理方法是:若是常规信号,在递达之前多次产生只计一次;若是实时信号,在递达之前产生多次则可以放在一个队列里。
本文只讨论常规信号,下面提到的信号都是常规信号。
3. 信号集
从上图我们可以知道,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次。同样的,阻塞标志也是这样表示的。所以阻塞和未决标志我们可以采用相同的数据类型sigset_t来存储,sigget_t称为
信号集。
这个类型可以表示每个信号的“有效”、“无效”状态。在未决信号集中,“有效”、
“无效”表示该信号是否处于未决状态;
在阻塞信号集中,“有效”、
“无效”
表示该信号是否被阻塞。阻塞信号集也叫做当前进程的信号屏蔽字。