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



信号掩码是线程特定的,这意味着阻止一个信号不会阻止它被传递到另一个没有阻止该信号的线程。当执行进入处理程序函数(假设没有SA_NODEFER(时,"当前"信号变为阻塞。

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

读取man sigaction:

sa_mask指定了在执行信号处理程序期间应被阻止的信号掩码(即,添加到调用信号处理程序的线程的信号掩码(。此外,触发处理程序的信号将被阻止,除非使用SA_NODEFER标志。

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

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

最新更新