[英]Second signal call in sighandler - what for?
最近我發現一些使用signal
代碼:
286 static void sighandler( int signum )
287 {
288 alarmed = 1;
289 signal( signum, sighandler );
290 }
291
292 void set_alarm( int seconds )
293 {
294 alarmed = 0;
295 signal( SIGALRM, sighandler );
296 alarm( seconds );
297 }
我很難弄清楚為什么我需要兩次調用signal
,特別是為什么我需要在sighandler
調用signal
? 我知道上面的代碼做什么,但不明白為什么我需要兩次調用signal
。
(1)兩次或更多次呼叫signal
並不罕見。 只是為兩個不同的信號設置了兩個處理程序。
(2)較舊的unix系統,用於在調用處理程序后將信號處置重置為默認值。 這段代碼正在重新建立處理程序。
GNU man (2) signal
頁在“可移植性”部分有專門針對此問題的幾段。 實際上是使用sigaction
的幾個原因之一。
信號調用僅對一個信號出現建立信號處理。 在調用信號處理函數之前, 庫會重置信號,以便在再次出現相同信號時執行默認操作 。 重置信號處理有助於防止無限循環,例如,如果在信號處理程序中執行的操作再次引發相同的信號。 如果希望您的處理程序每次出現時都用於信號,則必須在處理程序中調用signal來恢復它。 您應謹慎恢復信號處理。 例如,如果您繼續恢復SIGINT處理,則可能會失去中斷和終止程序的能力。
signal()
函數僅定義對下一個接收到的信號的處理, 之后將恢復默認處理 。 因此,如果程序需要使用非默認處理程序繼續處理信號,則信號處理程序有必要調用signal()
。
在某些系統中,如果通過函數調用signal()
,則在捕獲到第一個信號后,信號處理程序將重置為默認值(如果這樣定義,我還沒有即時發現)。 這就是為什么在信號處理程序中再次調用signal()
的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.