【问题标题】:Why doesn't the program inherit the signal dispositions of bash?为什么程序不继承 bash 的信号配置?
【发布时间】:2014-12-16 08:41:12
【问题描述】:

我使用以下 C 程序测试Solaris 10 上的信号行为:

#include <stdio.h>

int main(void)
{
        sleep(100);
        return 0;
}

在命令行中运行:

bash-3.2# ./test

然后使用psig检查test进程的信号行为:

bash-3.2# psig 11918
11918:  ./test
HUP     default
......
CONT    default
TTIN    default
TTOU    default
......

所有信号配置均为default

使用grep命令获取test的父进程:

 root 11918 17894   0 15:28:41 pts/25      0:00 ./test

然后使用psig检查test进程的父进程(bash)的信号行为:

bash-3.2# psig 17894          
17894:  bash
......
QUIT    ignored
......
TTIN    ignored
TTOU    ignored
......

根据我的理解,我认为bash应该调用fork生成test,根据fork,子进程应该继承信号处置。
为什么程序不继承bash 的信号配置?提前致谢!

【问题讨论】:

    标签: c bash unix signals solaris


    【解决方案1】:

    捕获的信号行为不会跨 exec() 继承。但是 OpenGroup 的 exec 手册说:

    在调用进程中设置为默认操作 (SIG_DFL) 的信号 image 应设置为新过程映像中的默认操作。 除 SIGCHLD 外,调用方设置为忽略 (SIG_IGN) 的信号 过程映像应设置为被新过程映像忽略。

    所以你的进程信号行为是这样的,因为bashexecing 之前设置了它;这是合理的。

    【讨论】:

    • 如何验证bash改变test的信号行为?
    • 要确认,请查看 bash 源代码——毕竟它是开源的。
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多