%60%20%E8%80%8C%E4%B8%8D%E9%80%B2%E4%B8%80%E6%AD%A5%E6%9B%B4%E6%94%B9%20%60execve()%60%20%E8%99%95%E7%90%86%E8%A8%8A%E8%99%9F%E8%99%95%E7%90%86%E7%9A%84%E6%96%B9%E5%BC%8F%EF%BC%9F.png)
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 或其父級的處理程序。