next up previous contents
下一主题: 10.2.1 SVR4 下的信号 向上: 10 应用程序移植到 前一主题: 10.1 介绍

10.2 信号处理

多年来,信号的定义和语义在 UNIX 的不同实现中以各种方式被修改。今天,主要有两类信号:不可靠信号可靠信号。不可靠信号是指那些一旦被调用,其信号处理程序不会保持安装状态的信号。这些“一次性”信号必须在信号处理程序自身内部重新安装信号处理程序,如果程序希望该信号保持安装状态。正因如此,存在一个竞态条件,即信号可能在处理程序重新安装之前再次到达,这可能导致信号丢失或触发信号的原始行为(例如终止进程)。因此,这些信号是“不可靠的”,因为信号捕获和处理程序重新安装操作不是原子性的。

在不可靠信号语义下,系统调用不会在被信号中断时自动重启。因此,为了使程序能够处理所有情况,程序需要在每次系统调用后检查 errno 的值,并在其值为 EINTR 时重新发出系统调用。

与此类似,不可靠信号语义没有提供一种简单的方法来获得原子暂停操作(使进程休眠直到信号到达)。由于重新安装信号处理程序的不可靠性,在某些情况下,信号可能在程序没有意识到的情况下到达。

另一方面,在可靠信号语义下,信号处理程序在被调用时保持安装状态,并且避免了重新安装的竞态条件。此外,某些系统调用可以被重启,并且可以通过 POSIX sigsuspend 函数获得原子暂停操作。





转换于
Fri Mar 29 14:43:04 EST 1996