【问题标题】:Reset mask of ignored signal in Linux在 Linux 中重置忽略信号的掩码
【发布时间】:2019-11-22 15:00:59
【问题描述】:

exec() 期间,阻塞信号的掩码(由sigprocmask() 设置)由子进程继承。

但现在我注意到在Linux下,也有忽略信号的掩码(grep < /proc/self/status ^SigIgn),它也被子进程继承。由于这些是由sigaction()act.sa_handler = SIG_IGN 设置的,所以我预计,作为信号处理程序,它们在执行期间会被重置。但他们不是。

考虑下面的例子:父母想忽略 SIGINT,但这也延伸到孩子,因此sleep 120 不能再被kill -INT $(pidof sleep) 杀死。

问题:

  1. 这是否符合 POSIX? sigaction() 的文档明确指出 sigaction 的影响不会存在 exec (引用:“...直到调用其中一个 exec 函数”)。 Linux 手册页说“忽略信号的配置保持不变”我猜这是 Linux 特有的功能。

  2. 如何正确可靠地重置忽略掩码?我没有发现 sigprocmask() 的模拟 - 管理阻塞信号 - 管理忽略信号的掩码。我是否应该简单地遍历所有信号并使用sigaction() 重置它们?

附:使用内核 v3.x 和 v4.9 进行测试,行为相同。

#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    struct sigaction act;
    sigset_t ss;

    system("grep -n < /proc/self/status ^SigIgn");

    memset(&act, 0, sizeof(act));
    act.sa_handler = SIG_IGN;
    sigaction( SIGINT, &act, NULL );

    system("grep -n < /proc/self/status ^SigIgn");

    sigemptyset(&ss);
    sigprocmask(SIG_SETMASK, &ss, NULL);

    system("grep -n < /proc/self/status ^SigIgn");

    system("sleep 120");

    return 0;
}

【问题讨论】:

标签: c linux signals posix


【解决方案1】:
  1. 这是否符合 POSIX?

是的,https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html 指定:

在调用进程中设置为默认操作 (SIG_DFL) 的信号 image 应设置为新过程映像中的默认操作。 除了 SIGCHLD,信号被设置为被调用者忽略(SIG_IGN) 过程映像应设置为被新过程映像忽略。 设置为由调用进程映像捕获的信号应设置为 新过程映像中的默认操作(请参阅 )。

(强调我的)

阻塞-信号掩码、默认-信号掩码和忽略-信号掩码都在 POSIX 中的 exec* 调用中继承,尽管 POSIX 并没有真正包含后两个掩码的概念(它们只是特殊的信号配置,分别为每个信号设置,与可以整体修改的阻塞信号掩码不同)。

  1. 如何正确可靠地重置忽略掩码?我发现没有 sigprocmask() 的模拟 - 管理阻塞信号 - 管理掩码 被忽略的信号。我是否应该简单地遍历所有信号并重置 他们用 sigaction()?

是的——使用sigactionsignal 遍历信号。 (虽然sigaction 应该是首选,但对于将信号设置为SIG_IGN/SIG_DFL,信号足够、便携且更紧凑。)。理想情况下,这应该在fork() 之后完成,以防止与其他线程竞争(信号处置是共享的全局状态)。

更好的是,您可以将posix_spawn/posix_spawnp 与一个属性(posix_spawnattr_t) 一起使用,该属性指定应在子进程中重置为默认值的信号集。 posix_spawnattr_setsigdefault 属性设置器可用于指定此信号集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多