bash 在收到 SIGINT 信號時會做什麼?
該頁面內容如下:
當 Bash 是互動式的時,在沒有任何陷阱的情況下,它會忽略 SIGTERM(因此 `kill 0’ 不會殺死互動式 shell),並且會擷取並處理 SIGINT(因此內置的等待是可中斷的)。當 Bash 收到一個 SIGINT 時,它會跳出任何正在執行的循環。
通常當程序接收到
SIGINT
信號時,程序會退出。但是當它接收到信號bash
時不會退出,而是“它會跳出任何正在執行的循環”。這意味著什麼?SIGINT
bash
這意味著當時正在執行的內置函式和循環被中止。要在 上實現 SIGINT 效果bash
,請使用Ctrl
+D
最後,bash 壞了。shell 程序應該處理 sigint 的方式是擷取它,然後停止所有處理並等待所有掛起的前台程序退出。實際上,SIGINT 沒有理由不中斷在前台執行的所有內容。這就是很久以前創建流程組的原因。使用者給出的 bash 的每個“命令”都應該在同一個 pgroup 中派生程序,並且應該將信號轉發到那個 pgroup。如果 pgroup 使用正確,則不需要轉發信號,因為預設情況下,分叉的每個程序都應該具有與 bash 相同的信號處理。nohup 應該導致所有分叉的程序都忽略 sighup ==。
bash 中遺漏了很多關於原始 unix shell 信號處理和程序關係的細節。特別是對 shellscript 的 SIGINT 應該完全停止整個 shellscript,而不是從循環中中斷,這只會導致它開始更多的處理,這可能會破壞文件,因為以前的工作由於 SIGINT 而沒有完成。
是的,trap 語句可以幫助你更乾淨地退出。但在原始的 unix shell 實現中從未需要它。它主要是用於臨時文件使用或其他類似細節的清理機制。現在,需要在應該退出的時候讓 shell 退出,這使得編寫容易被中斷的可靠 shell 腳本變得困難。