unix - 在多线程Linux程序中忽略/阻止SIGPIPE信号

标签 unix pthreads signals sigkill sigpipe

我有以下情况: 主题 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/

相关文章:

unix - 以另一个用户身份运行命令

linux - 汇总测量某些文件类型的磁盘空间

c - 无法使用 write() 写入标准输出

c - pthread_join() 期间的段错误

匹配时间相关 (1D) 信号的算法

c - Unix - 控制 C 和 Ctrl Z 信号拾取问题

linux - 为什么重定向符号会改变 ls 的行为?

c++ - 如何使用 pthread_setaffinity_np

c - 如何同时正确使用管道和信号?

c++ - 检查 Linux 功能以设置线程优先级