2017-07-11 67 views
0

我有以下情况: 线程1: 把一个孩子和孩子叉起来,再说一遍A又执行一个过程。乙在多线程linux程序中忽略/阻塞SIGPIPE信号

线程2: 侦听通过Unix域套接字的命令,并杀死的过程中,已经分叉的孩子B,A在线程1 回应来电者,它已经杀死了孩子

我想忽略线程2的SIGPIPE,因为我不希望程序在客户端关闭套接字时崩溃。所以我试图用

sigset_t set; 
sigemptyset(&set); 
sigaddset(&set, SIGPIPE); 
pthread_sigmask(SIG_BLOCK, &set, NULL); 

这样做有助于阻止SIGPIPE但它也阻止该线程1的能力发送SIGKILL给孩子这样做。

我也使用下面的主函数试图创建线程

signal(SIG_IGN, SIGPIPE); 

和 之前MSG_NOSIGNAL标志插座发送。

这也没有帮助我与SIGKILL的情况。任何想法如何在多线程条件下如何使用fork和execs以及SIGKILLs来安全地忽略SIGPIPE?

回答

0

经过一番调查,我找到了解决办法。我必须在每个fork()调用之后并在grand子中的exec()之前执行
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
。这导致SIGKILL不被阻止。