Bash 手册说
当要执行除内置或 shell 函数之外的简单命令时,... shell 捕获的陷阱将重置为从 shell 的父级继承的值,并且 shell 忽略的陷阱将被忽略
在 execve(2) 期间,已处理信号的处置被重置为默认值;被忽略信号的处理保持不变。”
“默认值”和“从 shell 父级继承的值”是否相同?
bash 是否会调用而execve()
无需进一步更改如何execve()
处理信号配置?
谢谢。
答案1
不,“默认值”和“从 shell 父级继承的值”不同。在 execve 的情况下,“默认值”指的是SIG_DFL
,这会导致由 指定的默认操作man 7 signal
。在 bash 的例子中,“从 shell 的父级继承的值”正是它所说的意思;如果这样的信号被SIG_IGN
其父级忽略 ( ),那么它的子级也会被忽略。
理解这里发生的事情的关键是“处理”这个词。它指的是自定义信号处理函数,与SIG_DFL
或不同SIG_IGN
。它必须由 execve 重置,因为新进程将不具有旧进程使用的信号处理函数。
请注意,较新版本的 execve 联机帮助页将“已处理”信号称为“捕获”信号,以与 Linux 其余部分使用的术语保持一致。这仍然与默认信号和忽略信号不同。
简单版本:如果 bash 或 bash 的父级有一个标记为 的信号SIG_IGN
,它也将SIG_IGN
在新的子级中。否则,它将SIG_DFL
在新的孩子中。它永远不可能是新子级中的处理程序,因为新子级中不会存在来自 bash 或其父级的处理程序。