簡體   English   中英

sighandler中的第二個信號呼叫-做什么用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM