16-总结
20.15 总结
信号是发生某种事件的通知机制,可以由内核、另一进程或进程自身发送给进程。存在一系列的标准信号类型,每种都有唯一的编号和目的。
信号传递通常是异步行为,这意味着信号中断进程执行的位置是不可预测的。有时(比如,硬件产生的信号),信号也可同步传递,这意味着在程序执行的某一点可以预期并重现信号的传递。
默认情况下,要么忽略信号,要么终止进程(生成或者不生成核心转储文件),要么停止一个正在运行的进程,要么重启一个已停止的进程。特定的默认行为取决于信号类型。此外,程序可以使用signal()或者sigaction()来显式忽略一个信号,或者建立一个由程序员自定义的信号处理器程序,以供信号到达时调用。出于可移植性考虑,最好使用sigaction()来建立信号处理器函数。
一个(具有适当权限的)进程可以使用kill()向另一进程发送信号。发送空信号(0)是判定特定进程ID是否在用的方式之一。
每个进程都具有一个信号掩码,代表当前传递遭到阻塞的一组信号。使用sigprocmask()可从信号掩码中添加或者移除信号。
如果接收的信号当前遭到阻塞,那么该信号将保持等待状态,直至解除对其阻塞。系统不会对标准信号进行排队处理,也就是说,将信号标记为等待状态(以及后续的传递)只会发生一次。进程能够使用sigpending()系统调用来获取等待信号集(用以描述多个不同信号的数据结构)。
与signal()相比,sigaction()系统调用在设置信号处置方面提供了更多控制,且更具灵活性。首先,可以指定一组调用处理器函数时将阻塞的额外信号。此外,可以使用各种标志来控制调用信号处理器时所发生的行为。例如,启用某些标志即可选择旧有的不可靠信号语义(不阻塞引发处理器调用的信号,在调用信号处理器之前就将信号处置重置为默认值)。
借助于pause(),进程可暂停执行,直至信号到达为止。
更多信息
[Bovet & Cesati, 2005]和[Maxwell, 1999]提供了Linux信号实现的背景资料。[Goodheart & Cox, 1994]详细说明了System V版本4对信号的实现。GNU C函数库手册(在线网访问:http://www.gnu.org/)包含了对信号的全面描述。