我有一个多线程程序。我想在一个线程中处理所有有意义的信号。这就是我在创建任何线程之前所做的事情:
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
)是否正确?
根据一些常识,我应该保留哪些其他信号?
答案 0 :(得分:3)
异步信号(其中大部分信号,包括kill
命令/功能发送的任何信号和控制终端产生的信号,如SIGINT
)都可以传送到进程中的任何线程信号未被阻塞,因此不需要在所有线程中保持它们畅通无阻。如果您正在使用专用信号处理线程,则希望它们在除信号处理线程之外的所有线程中都被阻止。
另一方面,同步信号由于该线程的动作而被传递到特定线程。它们包括SIGPIPE
,SIGBUS
,SIGSEGV
,SIGFPE
等。除了SIGPIPE
之外,除非您的严重错误,否则这些都不会发生程序,你可能想要阻止SIGPIPE
,所以你可以得到EPIPE
错误并正确处理这个条件。因此,在大多数情况下,我会说阻止它们并不会造成伤害。如果你真的发现自己需要来处理SIGSEGV
等等,你可能应该重新考虑原因,但同时可以随意取消阻止它。