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