【问题标题】:Interruption of signal handler with other signal?用其他信号中断信号处理程序?
【发布时间】:2018-01-25 03:04:11
【问题描述】:

信号处理程序能否被另一个信号中断(SIGKILL、SIGSTOP 除外)?

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

(Linux 和其他 Unix)

【问题讨论】:

    标签: linux unix signals


    【解决方案1】:

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

    但是有一些细微差别。

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

    此外,sigaction 可以通过设置const struct sigactionsa_mask 成员在处理程序执行期间显式阻止信号。您看到的大多数代码都会在结构初始化期间显式清空该成员,尽管它通常对sigfillset 这个成员更健壮,并且不用担心中断。

    所以,再次,是的。处理 EINTR、errno 等。视情况而定,或者更好的是,将处理程序设计为只设置一个sig_atomic_t 标志并避免许多担忧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多