在我的应用程序中,我通常希望拦截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,有时(未指定哪个线程将获得信号)我在基线程中的处理程序不会被调用 - 相反,信号只是从内部终止进程工作线程。这显然不酷。
所以我有一个信号处理线程并在其他任何地方阻塞信号。
但是,我没有注意到其他人这样做,很容易忘记这样做,而且它也不是完全可移植的。我还缺少一些更简单的技巧吗?
参考: