代码之家  ›  专栏  ›  技术社区  ›  C.M.

信号“auto block”(当执行进入处理程序函数时)是否阻止另一个这样的信号传递到另一个线程?

  •  2
  • C.M.  · 技术社区  · 6 年前

    信号屏蔽是线程特定的,这意味着阻塞信号不会阻止它被传递到另一个没有阻塞该信号的线程。当执行进入处理程序函数时(假定没有 SA_NODEFER )“电流”信号被阻断。

    这是否意味着它将被当前进程中的所有线程阻塞,或者下一个这样的信号可以传递到另一个线程(当它仍在第一个线程中处理时)?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Kerrek SB    6 年前

    阅读 man sigaction :

    sa_mask 指定应阻止的信号屏蔽(即,添加到信号屏蔽 调用信号处理程序的线程的 )在执行信号处理程序的过程中。此外,触发处理程序的信号将被阻止,除非 SA_NODEFER 使用标志。

    这听起来像当前处理的信号的屏蔽只影响处理线程,因此其他线程可能处理更多的信号。

    我认为多线程系统通常会阻塞 全部的 所有线程的信号,除了一个(或多个)专用信号处理线程(例如,在signalfd上轮询的线程)。这样你就不必担心信号会落在不可预测的线程上。