Signals

處理信號的選擇?

  • May 31, 2018

來自 APUE

一個程序有三種處理信號的選擇。

  1. 忽略信號。不建議將此選項用於表示硬體異常的信號,例如除以零或引用程序地址空間之外的記憶體,因為結果未定義。
  2. 讓預設動作發生。對於被零除的情況,預設是終止程序。
  3. 提供一個在信號發生時呼叫的函式(這稱為“捕捉”信號)。通過提供我們自己的函式,我們將知道信號何時發生,我們可以隨意處理它。
  1. 我認為只有兩個選擇——上面列出的最後兩個,它們都可以“忽略信號”(上面列出的第一個選擇)。

我的理解是正確的,還是在報價中確實存在三個不重疊的選擇?為什麼? 2. 書中提到某些信號的預設操作是忽略它。這是否意味著信號的動作是 SIG_IGN 或 SIG_DFL 或空函式?例如:

SIGCHLD的預設操作將被忽略。我們將在第 10 章中描述這些選項。

SIGCONT: 預設 操作是繼續一個停止的程序,但 如果程序沒有停止則忽略該信號。

謝謝。

當然,可以編寫一個什麼都不做的信號處理程序,從而有效地忽略信號,但第一種選擇是通過使用系統呼叫的SIG_IGN參數來專門忽略信號。signal()

所以在程式碼方面,假設SIGINT信號,這些是三個選項:

  • signal(SIGINT, SIG_IGN);忽視
  • 不呼叫該signal()函式,或呼叫它,signal(SIGINT, SIG_DFL);從而讓預設操作發生,即終止程序
  • signal(SIGINT, termination_handler);,其中termination_handler()是第一次出現信號時呼叫的函式。

來源:https ://www.gnu.org/software/libc/manual/html_node/Basic-Signal-Handling.html

對於信號的特定情況,預設操作是忽略信號,前兩個選項 (SIG_IGNSIG_DFL) 是相同的。創建一個空的處理函式可能不會有明顯的效果,除了(小)成本。

注意:signal()為簡單起見,在此答案中使用了 ,但sigaction()出於可移植性的原因,建議在新程式碼中使用。

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