忽略/阻止多线程linux程序

时间:2017-07-11 22:08:56

标签: unix pthreads signals sigkill sigpipe

我有以下情况: 线程1: 分叉一个孩子和一个孩子,再说A再次分叉并执行一个过程。乙

主题2: 通过Unix域套接字监听命令并终止进程,B已经被子进程分叉,线程1中的A 回应来电者已杀死孩子

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

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

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

我还尝试在创建线程

之前在main函数中使用以下内容
signal(SIG_IGN, SIGPIPE);

和     在套接字中使用MSG_NOSIGNAL标志发送。

这对于我的SIGKILL场景也没有帮助。任何想法如何安全地忽略上述多线程条件下的SIGPIPE与forks和execs以及发送的SIGKILL?

1 个答案:

答案 0 :(得分:1)

经过一番调查,我发现了解决方案。我不得不做pthread_sigmask(SIG_UNBLOCK, &set, NULL);
在每个fork()调用之后和在grand子中的exec()之前。这导致SIGKILL不被阻止。