Signals
處理信號的選擇?
來自 APUE
一個程序有三種處理信號的選擇。
- 忽略信號。不建議將此選項用於表示硬體異常的信號,例如除以零或引用程序地址空間之外的記憶體,因為結果未定義。
- 讓預設動作發生。對於被零除的情況,預設是終止程序。
- 提供一個在信號發生時呼叫的函式(這稱為“捕捉”信號)。通過提供我們自己的函式,我們將知道信號何時發生,我們可以隨意處理它。
- 我認為只有兩個選擇——上面列出的最後兩個,它們都可以“忽略信號”(上面列出的第一個選擇)。
我的理解是正確的,還是在報價中確實存在三個不重疊的選擇?為什麼? 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_IGN
和SIG_DFL
) 是相同的。創建一個空的處理函式可能不會有明顯的效果,除了(小)成本。注意:
signal()
為簡單起見,在此答案中使用了 ,但sigaction()
出於可移植性的原因,建議在新程式碼中使用。