信号掩码是特定于线程的,这意味着阻塞信号不会阻止信号传递到未阻塞该信号的另一个线程。当执行进入处理程序函数(假设没有SA_NODEFER
)时,“当前”信号将被阻塞。
这是否意味着它将在当前进程中的所有线程中被阻塞,还是有可能将下一个这样的信号传递到另一个线程中(当它仍在第一个线程中处理时)?
答案 0 :(得分:2)
阅读man sigaction
:
sa_mask
指定在执行信号处理程序期间应屏蔽(即添加到调用信号处理程序的线程的信号屏蔽 )的信号屏蔽。另外,除非使用SA_NODEFER
标志,否则触发处理程序的信号将被阻止。
这听起来像是当前处理的信号的屏蔽仅影响处理线程,因此其他线程可能会处理其他信号。
我认为,多线程系统通常会阻塞除一个(或几个)专用信号处理线程(例如,在signalfd上轮询的一个)以外的所有线程的 all 个信号。这样,您不必担心信号降落在某些不可预测的线程上。