Ignoring/blocking multi-threaded linux 程序中的 SIGPIPE 信号
Ignoring/blocking SIGPIPE signals in multi-threaded linux program
我遇到以下情况:
线程 1:
Forks a child 和 child,比如说 A 又 forks 并执行一个进程。 B
线程 2:
通过 Unix Domain Socket 侦听命令并终止进程,B 已被 child 派生,A 在线程 1 中
响应呼叫者它已经杀死了 child
我想忽略线程 2 的 SIGPIPE,因为我不希望程序在客户端关闭套接字时崩溃。所以我尝试使用
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
这样做有助于阻止 SIGPIPE,但也会阻止线程 1 将 SIGKILL 发送到 child。
我也试过在创建线程之前在主函数中使用下面的代码
signal(SIG_IGN, SIGPIPE);
和
在套接字中发送 MSG_NOSIGNAL 标志。
这对我使用 SIGKILL 的情况也没有帮助。知道如何在 multi-threaded 条件下安全地忽略 SIGPIPE 吗?
经过一番调查,我找到了解决办法。我必须做
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
在孙子中的每个 fork() 调用之后和 exec() 之前。这导致 SIGKILL 未被阻止。
我遇到以下情况: 线程 1: Forks a child 和 child,比如说 A 又 forks 并执行一个进程。 B
线程 2: 通过 Unix Domain Socket 侦听命令并终止进程,B 已被 child 派生,A 在线程 1 中 响应呼叫者它已经杀死了 child
我想忽略线程 2 的 SIGPIPE,因为我不希望程序在客户端关闭套接字时崩溃。所以我尝试使用
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
这样做有助于阻止 SIGPIPE,但也会阻止线程 1 将 SIGKILL 发送到 child。
我也试过在创建线程之前在主函数中使用下面的代码
signal(SIG_IGN, SIGPIPE);
和 在套接字中发送 MSG_NOSIGNAL 标志。
这对我使用 SIGKILL 的情况也没有帮助。知道如何在 multi-threaded 条件下安全地忽略 SIGPIPE 吗?
经过一番调查,我找到了解决办法。我必须做 pthread_sigmask(SIG_UNBLOCK, &set, NULL);
在孙子中的每个 fork() 调用之后和 exec() 之前。这导致 SIGKILL 未被阻止。