在C中的多线程程序中,线程不应阻塞哪些信号?

时间:2014-11-16 14:04:53

标签: c multithreading signals

我有一个多线程程序。我想在一个线程中处理所有有意义的信号。这就是我在创建任何线程之前所做的事情:

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);

但我的理智建议保留一些信号畅通无阻,因为有很多情况可以将信号直接发送到特定线程:SIGSEGVSIGPROF - 我相信,它就像离开一样好在交互式程序中取消阻止SIGINT


我的建议对于这两个信号(SIGSEGVSIGPROF)是否正确?

根据一些常识,我应该保留哪些其他信号?

1 个答案:

答案 0 :(得分:3)

异步信号(其中大部分信号,包括kill命令/功能发送的任何信号和控制终端产生的信号,如SIGINT)都可以传送到进程中的任何线程信号未被阻塞,因此不需要在所有线程中保持它们畅通无阻。如果您正在使用专用信号处理线程,则希望它们在除信号处理线程之外的所有线程中都被阻止。

另一方面,同步信号由于该线程的动作而被传递到特定线程。它们包括SIGPIPESIGBUSSIGSEGVSIGFPE等。除了SIGPIPE之外,除非您的严重错误,否则这些都不会发生程序,你可能想要阻止SIGPIPE,所以你可以得到EPIPE错误并正确处理这个条件。因此,在大多数情况下,我会说阻止它们并不会造成伤害。如果你真的发现自己需要来处理SIGSEGV等等,你可能应该重新考虑原因,但同时可以随意取消阻止它。