Bob*_*630 6 c++ linux multithreading signals
所以我有一个有趣的设计问题.我正在研究SLES 9+ Linux,内核2.6+,并且有一个充当RPC客户端的多线程应用程序.我们的想法是拥有很少的线程来处理请求; 一个这样的请求是作为子进程开始"工作".
现在我遇到的问题是设置一个适当的信号处理程序来处理各种信号.我所做的是设置另一个线程,用于信号处理sigwait()状态,同时阻止其他线程中的所有相关信号.我们的想法是,流程的所有信号都应传递给信号处理线程,其余的线程应该只关心处理请求时的处理.
所有这些都很有效,除了那些腐烂的孩子,总是把他们的飞盘扔进我的后院并践踏我的草坪......但是严肃地说,我的信号处理线程没有得到SIGCHLD信号.我对这里发生的事情的最好猜测是因为信号处理线程不是产生子节点的线程,它不是接收SIGCHLD的线程,而是我的工作线程.
至于我的问题:
As per David Schwartz request SLES9: NPTL 2.3.5, SLES10: NPTL2.4
(编辑:因为我看不懂,而你已经在进行正确的 pthread_sigmask 调用......)
在2.6内核中,当SIGCHLD设置为ignore/SIG_IGN时,内核将为您获取子进程。听起来好像您为信号处理线程设置了 SIGCHLD 的特定处理程序,以避免将 SIGCHLD 设置为 SIG_IGN/SIG_DFL。
编辑(来自评论):我认为你遇到了极端情况。如果在生成子线程的线程中将其保留为 SIG_IGN,则内核甚至不会发送 SIGCHLD。但如果您将其设置为要处理,则会调用您的处理程序。我认为如果您设置了一个处理程序,但仍然在 pthread_sigmask 中阻止了信号,则信号将被传递到没有阻止信号的线程(您的sigwait线程)。