
來自APUE
進程有三種處理訊號的選擇。
忽略信號。對於表示硬體異常的訊號,例如除以零或引用進程位址空間之外的內存,不建議使用此選項,因為結果未定義。
讓預設操作發生。對於被零除的情況,預設是終止進程。
提供一個在訊號發生時呼叫的函數(這稱為「捕獲」訊號)。透過提供我們自己的函數,我們將知道訊號何時發生,並且我們可以按照我們的意願處理它。
我認為只有兩個選擇——上面列出的最後兩個,它們都可以“忽略信號”(上面列出的第一個選擇)。
我的理解是否正確,或者確實存在引用中的三個不重疊的選擇?為什麼?
書中提到,某些訊號的預設操作是忽略它。這是否意味著訊號的動作是SIG_IGN或SIG_DFL或空函數?例如:
這預設SIGCHLD 的操作是被忽略。我們將在第 10 章中描述這些選項。
訊號控制: 預設 操作是繼續停止的進程,但是 忽略如果進程沒有停止則發出信號。
謝謝。
答案1
當然,我們可以編寫一個不執行任何操作的訊號處理程序,從而有效地忽略該訊號,但第一個選項是透過使用系統呼叫的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()
出於可移植性的原因,建議在新程式碼中使用 。