信号处理程序是否可以被另一个信号中断(SIGKILL,SIGSTOP除外)?
因此,在调用可中断的系统调用时,是否需要在信号处理程序中检查EINTR
?
(Linux和其他Unix)
答案 0 :(得分:1)
是的,信号处理程序的执行本身可能会被另一个信号传递中断。
然而,有一些细微差别。
默认情况下,用户定义的信号处理程序会临时阻止调用它们的信号。除非设置了SA_NODEFER标志,否则这是sigaction
的默认行为。 (这也是旧的,不鼓励的signal
函数的行为,至少在大多数实现中都是如此。)
此外,sigaction
可以通过设置sa_mask
的{{1}}成员,在处理程序执行期间显式阻止信号。你看到的大多数代码都会在struct初始化期间显式清空这个成员,虽然它对sigfillset
这个成员来说通常更健壮,而不用担心中断。
所以,再次,是的。处理EINTR,const struct sigaction
,& c。在适当的情况下,或者更好的是,设计处理程序只需设置errno
标志并避免许多担忧。