用其他信号中断信号处理程序?

时间:2018-01-25 03:04:11

标签: linux unix signals

信号处理程序是否可以被另一个信号中断(SIGKILL,SIGSTOP除外)?

因此,在调用可中断的系统调用时,是否需要在信号处理程序中检查EINTR

(Linux和其他Unix)

1 个答案:

答案 0 :(得分:1)

是的,信号处理程序的执行本身可能会被另一个信号传递中断。

然而,有一些细微差别。

默认情况下,用户定义的信号处理程序会临时阻止调用它们的信号。除非设置了SA_NODEFER标志,否则这是sigaction的默认行为。 (这也是旧的,不鼓励的signal函数的行为,至少在大多数实现中都是如此。)

此外,sigaction可以通过设置sa_mask的{​​{1}}成员,在处理程序执行期间显式阻止信号。你看到的大多数代码都会在struct初始化期间显式清空这个成员,虽然它对sigfillset这个成员来说通常更健壮,而不用担心中断。

所以,再次,是的。处理EINTR,const struct sigaction,& c。在适当的情况下,或者更好的是,设计处理程序只需设置errno标志并避免许多担忧。