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 或其父級的處理程序。

相關內容