我有以下情况: 主题 1: fork 一个子进程,然后再 fork 一个子进程,假设 A 又再次 fork 并执行一个进程。
主题 2: 通过 Unix 域套接字监听命令并终止线程 1 中的子进程 A fork 的进程 B 回复调用者它已经杀死了 child
我想忽略线程 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 和 exec 以及 SIGKILL 的多线程条件下(如上面)安全地忽略 SIGPIPE 吗?
最佳答案
经过一番调查,我找到了解决办法。我必须做 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
在每次 fork() 调用之后和孙子中的 exec() 之前。这导致 SIGKILL 没有被阻止。
关于unix - 在多线程Linux程序中忽略/阻止SIGPIPE信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45045259/