遞歸請求的信號會發生什麼?
如果過程變得緩慢,人們經常會取消
Ctrl + c
或Ctrl + z
放棄工作,在這種情況下,這些信號中的哪一個得到處理,第一個還是最後一個?每個信號都被處理了嗎?如果不是,那麼哪些被忽略了?
信號按照您通過終端鍵入它們的順序發送到核心。如果您使用
Ctrl
+C
,則指示核心將信號 SIGINT 發送到前台程序組。收到此消息後,正在執行的命令將被終止。使用
Ctrl
+表示Z
您發送信號 SIGSTP。這實際上並沒有殺死程序,只是告訴它暫時停止。使用此選項時,您可以通過命令告訴 shell 將其帶回前台來恢復程序,fg
或者您可以使用bg
命令將其置於後台。如果一個作業已通過 SIGSTP 信號停止,那麼您可以使用如下
kill
命令真正終止它:$ kill %1
%1
您剛剛 SIGSTP 的工作的工作 ID 在哪裡。檢查停止的作業
您可以使用該
job
命令查看在 shell 中停止了哪些作業,如下所示:$ sleep 1000 ^Z [1]+ Stopped sleep 1000 $ jobs [1]+ Stopped sleep 1000
在這裡,我使用
Ctrl
+Z
來停止我的sleep 1000
命令。在輸出中,[1]
對應於%1
我上面提到的那個。Ctrl
像這樣殺死它會產生與+相同的效果C
。$ kill %1 [1]+ Terminated sleep 1000
我上面提到的
fg
andbg
命令將作用於+
編號後面帶有加號的作業。注意這裡,在jobs
輸出中:[1]+ Stopped sleep 1000
如果我有幾份工作,那就更明顯了,例如:
$ jobs [1] Stopped sleep 1000 [2]- Stopped sleep 2000 [3]+ Stopped sleep 3000
因此,任何裸機
fg
或bg
命令都將使用+
. 我可以像這樣針對特定的:$ fg %1 sleep 1000
如果接收者有時間在下一個信號到來之前開始處理一個信號,那麼所有的信號都將按順序處理。
當一個程序接收到一個信號但還沒有準備好處理它時(例如,信號被屏蔽,或者程序停止),核心將信號標記為待處理。信號將被傳遞。
如果在程序未準備好時接收到多個不同數量的信號,則將處理所有信號。信號被一一傳遞給程序。POSIX 未指定它們的傳遞順序;在Linux上,它們按數字傳遞,最小的在前(例如,如果未決,則首先傳遞 SIGHUP=1,然後傳遞 SIGQUIT=2,等等);FreeBSD不做任何保證。
如果在程序未準備好時接收到多個具有相同編號的信號,則可以合併這些信號。POSIX 沒有具體說明會發生什麼,但大多數 unice 會合併。例如,如果您執行
kill -1 234; kill -1 234
,那麼程序 234 的信號 1 的處理程序是否接收一次或兩次是時間問題,這取決於 234 是否獲得傳遞第一個信號的時間片。