【问题标题】:Ignoring/blocking SIGPIPE signals in multi-threaded linux program在多线程Linux程序中忽略/阻止SIGPIPE信号
【发布时间】:2017-12-16 03:33:49
【问题描述】:

我有以下情况: 线程 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,并发送了 fork 和 exec 以及 SIGKILL 吗?

【问题讨论】:

    标签: unix pthreads signals sigkill sigpipe


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2021-05-19
      相关资源
      最近更新 更多