Signals

遞歸請求的信號會發生什麼?

  • August 22, 2014

如果過程變得緩慢,人們經常會取消Ctrl + cCtrl + 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

我上面提到的fgandbg命令將作用於+編號後面帶有加號的作業。注意這裡,在jobs輸出中:

[1]+  Stopped                 sleep 1000

如果我有幾份工作,那就更明顯了,例如:

$ jobs
[1]   Stopped                 sleep 1000
[2]-  Stopped                 sleep 2000
[3]+  Stopped                 sleep 3000

因此,任何裸機fgbg命令都將使用+. 我可以像這樣針對特定的:

$ fg %1
sleep 1000

如果接收者有時間在下一個信號到來之前開始處理一個信號,那麼所有的信號都將按順序處理。

當一個程序接收到一個信號但還沒有準備好處理它時(例如,信號被屏蔽,或者程序停止),核心將​​信號標記為待處理。信號將被傳遞。

如果在程序未準備好時接收到多個不同數量的信號,則將處理所有信號。信號被一一傳遞給程序。POSIX 未指定它們的傳遞順序;在Linux上,它們按數字傳遞,最小的在前(例如,如果未決,則首先傳遞 SIGHUP=1,然後傳遞 SIGQUIT=2,等等);FreeBSD不做任何保證。

如果在程序未準備好時接收到多個具有相同編號的信號,則可以合併這些信號。POSIX 沒有具體說明會發生什麼,但大多數 unice 會合併。例如,如果您執行kill -1 234; kill -1 234,那麼程序 234 的信號 1 的處理程序是否接收一次或兩次是時間問題,這取決於 234 是否獲得傳遞第一個信號的時間片。

引用自:https://unix.stackexchange.com/questions/151307