9

在我的应用程序中,我通常希望拦截SIGINTSIGTERM发出信号以便优雅地关闭。

为了防止工作线程“窃取”信号,我在每个入口点执行此操作:

// 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,有时(未指定哪个线程将获得信号)我在基线程中的处理程序不会被调用 - 相反,信号只是从内部终止进程工作线程。这显然不酷。

所以我有一个信号处理线程并在其他任何地方阻塞信号。

但是,我没有注意到其他人这样做,很容易忘记这样做,而且它也不是完全可移植的。我还缺少一些更简单的技巧吗?


参考:

4

1 回答 1

5

我觉得这是一件非常合理的事情。

main您可以在生成任何其他线程之前阻止 中的信号。生成的线程将继承创建者线程信号掩码,您只能在信号处理线程中取消阻塞信号(仅当该线程也生成其他线程时要小心)。

或者你可以让信号在任何地方都被阻塞,sigwait并在信号处理线程中通过和朋友明确地处理它们。

于 2012-11-21T22:28:36.093 回答