所以我有一个有趣的设计问题.我正在研究SLES 9 Linux,内核2.6,并且有一个充当RPC客户端的多线程应用程序.我们的想法是拥有很少的线程来处理请求;一个这样的请求是作为子进程开始“工作”.
现在我遇到的问题是设置一个适当的信号处理程序来处理各种信号.我所做的是为信号处理设置另一个线程,使其处于sigwait()状态,同时阻塞其他线程中的所有相关信号.我们的想法是,流程的所有信号都应传递给信号处理线程,其余的线程应该只关心处理请求时的处理.
所有这些都很有效,除了那些腐烂的孩子,总是把他们的飞盘扔进我的后院并践踏我的草坪……但是严肃地说,我的信号处理线程没有得到SIGCHLD信号.我对这里发生的事情的最好猜测是因为信号处理线程不是产生子节点的线程,它不是接收SIGCHLD的线程,而是我的工作线程.
至于我的问题:
>我是不是疯狂的SIGCHLD没有进入我的信号处理程序线程?
>如果我不疯狂(这是一段时间,我知道),你将如何解决这个小问题?目前我正在做的是为所有线程上的SIGCHLD设置一个非常简单的信号处理程序,它只是将信号作为SIGUSR2信号重新发送到进程组,该进程组在允许信号处理线程的所有线程中被阻塞.这似乎有效,但是我不禁想到我错过了一些东西或者有更好的方法来解决这个问题……他,得到它,处理这个…好吧我现在就停下来
根据David Schwartz的请求SLES9:NPTL 2.3.5,SLES10:NPTL2.4
在2.6内核中,当SIGCHLD设置为ignore / SIG_IGN时,内核将为您收集子进程.听起来如果为信号处理线程设置了SIGCHLD的特定处理程序,以避免将SIGCHLD设置为SIG_IGN / SIG_DFL.
编辑(来自评论):
我认为你遇到了一个问题.如果将它作为SIG_IGN留在产生子节点的线程中,内核甚至不会发送SIGCHLD.但如果将其设置为处理,则会调用您的处理程序.我想如果你设置一个处理程序,但仍然阻止pthread_sigmask中的信号,信号将被传递给没有信号阻塞的线程(你的sigwait线程).