我有一个多线程程序。我想在一个线程中处理所有有意义的信号。这就是我在创建任何线程之前所做的:
sigset_t signal_set, old_set;
sigfillset(&signal_set);
// What signals should I leave unblocked here?
pthread_sigmask(SIG_SETMASK, &signal_set, &old_set);
std::thread( /* some args */ );
pthread_sigmask(SIG_SETMASK, &old_set, nullptr);
但我的理智建议让一些信号畅通无阻,因为在很多情况下信号可能会直接发送到特定线程:SIGSEGV
或 SIGPROF
- 我相信,这与在交互式程序中保留未阻塞的 SIGINT
一样好。
我对这两个信号(SIGSEGV
、SIGPROF
)的建议是否正确?
根据一些常识,我应该畅通哪些其他信号?
最佳答案
异步信号(这是其中的大部分,包括由 kill
命令/函数发送的任何信号和由控制终端生成的信号,如 SIGINT
)可交付给任何线程信号畅通的进程,因此无需在所有线程中保持它们畅通。如果您使用专用的信号处理线程,您希望它们在除信号处理线程之外的所有线程中被阻塞。
另一方面,同步信号作为该线程的操作的结果传递到特定线程。它们包括SIGPIPE
、SIGBUS
、SIGSEGV
、SIGFPE
等。SIGPIPE
除外, 除非你的程序中有严重的错误,否则这些都不会发生,并且你可能想阻止 SIGPIPE
所以你可以得到 EPIPE
错误并处理这个状况良好。所以在大多数情况下,我会说完全阻止它们并没有什么坏处。如果您真的发现自己需要处理 SIGSEGV
或类似的东西,您可能应该重新考虑原因,但与此同时,请随意解除阻止。
关于c - C中的多线程程序中哪些信号不应该被线程阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26957816/