首页 > 解决方案 > 信号“自动阻塞”(当执行进入处理函数时)是否会阻止另一个这样的信号被传递到另一个线程?

问题描述

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

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

标签: clinuxmultithreadingsignals

解决方案


阅读man sigaction

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

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

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


推荐阅读