2

最近我发现了一些使用的代码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 }

我很难弄清楚为什么我需要打2 次电话,signal尤其是为什么我需要打电话?我知道上面的代码做了什么,但不明白为什么我需要调用2 次。signalsighandlersignal

4

3 回答 3

2

处理信号

对信号的调用只为信号的一次出现建立信号处理。在调用信号处理函数之前,库会重置信号,以便在再次出现相同信号时执行默认操作。例如,如果在信号处理程序中执行的操作再次引发相同的信号,则重置信号处理有助于防止无限循环。如果您希望处理程序在每次发生时都用于信号,则必须在处理程序中调用信号以恢复它。在恢复信号处理时应谨慎。例如,如果您不断恢复 SIGINT 处理,您可能会失去中断和终止程序的能力。

signal()函数仅定义下一个接收到的信号的处理,之后恢复默认处理signal()因此,如果程序需要继续使用非默认处理程序处理信号,则有必要调用信号处理程序。

于 2013-07-18T15:58:59.623 回答
2

(1) 调用signal两次或多次并不少见。它只是为 2 个不同的信号设置了两个处理程序。

(2) 旧的 unix 系统用于在调用处理程序后将信号处置重置为默认值。此代码正在重新建立处理程序。

GNUman (2) signal页面在“可移植性”部分有几个段落专门讨论这个问题。实际上是使用的几个原因之一sigaction

于 2013-07-18T15:47:09.757 回答
1

在某些系统中,如果signal()使用函数调用,信号处理程序会在第一个信号被捕获后重置为默认值(如果它被定义为这样,我还没有动态发现)。signal()这就是在信号处理程序中再次调用的原因。

于 2013-07-18T15:47:17.583 回答