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@yak
signal()
在C标准中有规定<代码>sigaction()不可用。因此,是的,
sigaction()
将避免调用
signal()
sigaction()
还处理在处理信号时出现第二个信号的情况@yak您正在信号处理程序中调用printf,在信号处理程序中调用printf是不安全的,因为信号处理程序可以异步调用:我建议您如果想在严肃的应用程序中处理信号,从这里学习@yak
希望做同样的事情,但使用sigaction而不是signal
?=>是的,这被认为是一个更好的方法。