繁体   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