bash 是否调用 `execve()` 而不进一步更改 `execve()` 处理信号处理的方式?

bash 是否调用 `execve()` 而不进一步更改 `execve()` 处理信号处理的方式?

Bash 手册说

当要执行除内置或 shell 函数之外的简单命令时,... shell 捕获的陷阱将重置为从 shell 的父级继承的值,并且 shell 忽略的陷阱将被忽略

execve() 联机帮助页

在 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 或其父级的处理程序。

相关内容