深入理解计算机系统-第八章 异常流控制
深入理解计算机系统阅读记录
8.5信号
传送一个信号到目的进程由两个不同的步骤组成
发送信号:内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程。发送信号可以有两种原因:
1)内核检测到一个系统事件,比如除零错误或者子进程的终止
2)一个进程调用了kill函数,显示的要求内核发送一个信号给目的进程。一个进程可以发送信号给自己
接收信号:当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。进程可以忽略这个信号,终止或者通过执行一个称为信号处理程序的用户层函数捕获这个信号。
阻塞:指来的信号不被处理,但是会添加到待处理集合中。不会丢弃
有两种情况如下
隐式阻塞:当前信号s正在处理,此时又来一个s信号,后来的s信号被阻塞直到前面的s信号处理完成。
显式阻塞:调用sigprocmask函数和它的辅助函数,明确的阻塞和解除阻塞选定的信号。
一个发出而没有被接收的信号叫做待处理信号。在任何时刻,一种类型至多只会有一个待处理信号。如果一个进程有一个类型为k的待处理信号,那么任何接下来发送到这个进程的类型为k的信号都不会排队等待;它们只是被简单的丢弃。一个进程可以有选择性的阻塞某种信号。当一个信号被阻塞时,它仍可以被发送,但是产生的待处理信号不会被接收,直到进程取消对这种信号的阻塞。(注意:如果两个类型为k的信号发送给一个目的进程,而如果目的进程当前正在执行信号k的处理程序,所以信号k被阻塞了,那么第二个信号就简单的丢弃了,不会排队,关键思想是如果存在一个未处理的信号就表明至少有一个信号已经到达了)
一个待处理信号最多只能被接收一次。内核为每个进程在penging为向量中维护着待处理信号的集合,而在blocked位向量中维护着被阻塞的信号集合。只要传送了一个类型为k的信号,内核就会设置pending中的第k位,而只要接收了一个类型为k的信号,内核就会清除pending中的第k位。