我在处理多线程服务器中的信号处理时遇到问题。我为每个连接创建一个线程,但我希望有一个选项可以使用 SIGINT 终止服务器。然而,当其中一个线程捕获信号时,事情就会变得很糟糕。有没有办法阻止除主线程之外的线程获取信号?
线程从创建它的线程继承其信号掩码。
假设创建线程是“主”线程,您可能希望在创建线程之前阻止所有有问题的信号,并在代码完成后取消阻止创建线程中的信号。
修改线程的信号掩码 POSIX 定义pthread_sigmask() http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_sigmask.html.
Update:
当需要在多线程环境中定期执行信号处理时,一种有趣的方法是将所有信号委托给一个单独的线程,除了等待信号到达之外什么都不做sigwait() http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigwait.html.
为此:
- 根据您要处理的信号设置信号掩码pthread_sigmask() http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_sigmask.html在“主”线程中先于其他任何事情。
- 然后创建线程来处理信号。
- 然后使用以下命令阻止“主”线程中来自 1. 的所有信号pthread_sigmask() http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_sigmask.html again.
- 最后创建所有其他线程。
结果是 1. 下指定的所有信号都将转到 2.. 下创建的线程。所有其他线程将不会接收 1.. 下指定的任何信号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)