C 第二次信号呼叫-为什么?
最近我发现了一些使用C 第二次信号呼叫-为什么?,c,signals,C,Signals,最近我发现了一些使用信号的代码: 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, sighand
信号的代码
:
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
两次,尤其是为什么我需要在signandler
中调用signal
?我知道上述代码的作用,但不明白为什么我需要调用信号
两次。(1)调用信号
两次或更多次并不罕见。它只是为两个不同的信号设置两个处理程序
(2) 较旧的unix系统用于在调用处理程序后将信号配置重置为默认值。此代码正在重新建立处理程序
在“可移植性”部分有几段专门讨论这一点。实际上,使用
sigaction
的几个原因之一是,在某些系统中,如果使用函数调用signal()
,则在捕获第一个信号后,信号处理程序将重置为默认值(我还没有即时发现是否定义为默认值)。这就是信号处理程序中再次调用signal()
的原因。
对信号的调用只为一个信号的出现建立信号处理。在调用信号处理功能之前,库重置信号,以便在相同信号再次出现时执行默认操作。重置信号处理有助于防止无限循环,例如,如果在信号处理程序中执行的操作再次引发相同的信号。如果希望处理程序在每次发生信号时都用于该信号,则必须在处理程序中调用信号来恢复该信号。恢复信号处理时应谨慎。例如,如果继续恢复SIGINT处理,则可能会失去中断和终止程序的能力
signal()
功能仅定义下一个接收信号的处理,然后恢复默认处理。因此,如果程序需要继续使用非默认处理程序处理信号,则信号处理程序必须调用signal()
。您不调用内部信号处理程序,而是注册信号again@yaksignal()
在C标准中有规定<代码>sigaction()不可用。因此,是的,sigaction()
将避免调用signal()
,sigaction()
还处理在处理信号时出现第二个信号的情况@yak您正在信号处理程序中调用printf,在信号处理程序中调用printf是不安全的,因为信号处理程序可以异步调用:我建议您如果想在严肃的应用程序中处理信号,从这里学习@yak希望做同样的事情,但使用sigaction而不是signal
?=>是的,这被认为是一个更好的方法。