C Linux中被忽略信号的复位掩码

C Linux中被忽略信号的复位掩码,c,linux,signals,posix,C,Linux,Signals,Posix,在exec()期间,阻塞信号的掩码(由sigprocmask()设置)由子进程继承 但现在我注意到,在Linux下,还有被忽略信号的掩码(grep

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

但现在我注意到,在Linux下,还有被忽略信号的掩码(
grep
),它也被子进程继承。由于这些是通过
sigaction()
act.sa_handler=SIG_IGN
设置的,因此我希望作为信号处理程序,它们在执行期间会重置。但事实并非如此

考虑下面的例子:父级希望忽略SIGINT,但这也扩展到了子级,因此不能再使用
kill-INT$(pidof sleep)
杀死
sleep 120

问题:

  • 这个POSIX兼容吗?的文档明确指出,
    sigaction
    的效果不会持续
    exec
    (引用:“…直到调用其中一个exec函数”)。Linux手册页说“忽略信号的处理保持不变”,我想这是Linux特有的特性

  • 如何正确可靠地重置忽略掩码?我没有发现类似的
    sigprocmask()
    -管理阻塞信号-管理被忽略信号的掩码。我是否应该简单地迭代所有信号并使用
    sigaction()
    重置它们

  • 用内核v3.x和v4.9测试的p.S.性能相同

    #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;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    int main()
    {
    结构动作法;
    sigset_t ss;
    系统(“grep-n
  • 这个POSIX兼容吗
  • 是,指定:

    在调用过程中设置为默认操作(SIG_DFL)的信号 图像应设置为新过程图像中的默认动作。 除SIGCHLD外,信号设置为被调用方忽略(SIG_IGN) 过程图像应设置为被新过程图像忽略。 呼叫过程图像捕捉到的信号应设置为 新进程映像中的默认操作(请参阅)

    (强调矿山)

    阻塞的-信号掩码、默认的-信号掩码和忽略的-信号掩码都是通过POSIX中的
    exec*
    调用继承的,尽管POSIX实际上没有后两个掩码的概念(它们只是特殊的信号处理,分别为每个信号设置,不同于可以整体修改的阻塞信号屏蔽)

  • 如何正确可靠地重置忽略掩码?我没有发现 模拟sigprocmask()-管理阻塞信号-管理掩码 忽略的信号。我应该简单地迭代所有信号并重置吗 是否使用sigaction()删除它们
  • 是的,使用
    sigaction
    sigaction
    迭代信号(而
    sigaction
    应优先考虑,对于将信号设置为
    SIG\u-IGN
    /
    SIG\u-DFL
    ,信号充足、可移植且更紧凑)。理想情况下,这应在
    fork()之后进行
    防止与其他线程争用(信号处理为共享全局状态)


    更好的是,您可以使用带有属性(
    posix\u spawnatr\t
    )的
    posix\u spawn
    /
    posix\u spawnp
    )指定应在子进程中重置为默认值的信号集。
    posix\u spawnatr\u setsigdefault
    属性设置器可用于指定此信号集。

    您不能将
    sigprocmask
    sigpemptyset
    一起使用来重置拨叉的阻塞信号吗?这可能会帮助您: