【发布时间】:2018-01-25 03:04:11
【问题描述】:
信号处理程序能否被另一个信号中断(SIGKILL、SIGSTOP 除外)?
因此,在调用可中断系统调用时,我是否需要在信号处理程序中检查 EINTR?
(Linux 和其他 Unix)
【问题讨论】:
信号处理程序能否被另一个信号中断(SIGKILL、SIGSTOP 除外)?
因此,在调用可中断系统调用时,我是否需要在信号处理程序中检查 EINTR?
(Linux 和其他 Unix)
【问题讨论】:
是的,信号处理程序的执行本身可能会被另一个信号的传递中断。
但是有一些细微差别。
默认情况下,用户定义的信号处理程序会暂时阻止调用它们的信号。这是sigaction 的默认行为,除非设置了 SA_NODEFER 标志。 (这也是旧的、不鼓励使用的 signal 函数的行为,至少在大多数实现中是这样。)
此外,sigaction 可以通过设置const struct sigaction 的sa_mask 成员在处理程序执行期间显式阻止信号。您看到的大多数代码都会在结构初始化期间显式清空该成员,尽管它通常对sigfillset 这个成员更健壮,并且不用担心中断。
所以,再次,是的。处理 EINTR、errno 等。视情况而定,或者更好的是,将处理程序设计为只设置一个sig_atomic_t 标志并避免许多担忧。
【讨论】: