在我的应用程序中,我通常想拦截SIGINT
和SIGTERM
信号,以便优雅地关闭。
为了防止工作线程“窃取”信号,我在每个输入点执行此操作:
// Block signals in this thread
sigset_t signal_set;
sigaddset(&signal_set, SIGINT);
sigaddset(&signal_set, SIGTERM);
sigaddset(&signal_set, SIGHUP);
sigaddset(&signal_set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);
如果我不这样做,当我执行 Ctrl + C 时,有些时候(未指定哪个线程会获得信号)我的处理程序在不会调用基本线程 - 相反,信号只是从工作线程中终止进程。这显然不是很酷。
所以我在其他任何地方都有一个信号处理线程和阻塞信号。
但是,我没有注意到其他任何人这样做,忘记这样做很容易,而且它也不是完全可移植的。是否有一些我想念的更简单的技巧?
参考文献:
答案 0 :(得分:5)
我发现这是完全合理的事情。
在生成任何其他线程之前,您可以阻止main
中的信号。生成的线程将继承创建者线程信号掩码,您只能在信号处理线程中解除阻塞信号(仅当该线程产生其他线程时才要小心)。
或者你可以在任何地方阻止信号,并通过信号处理线程中的sigwait
和朋友明确处理它们。