4

我有一个关于处理信号的问题。假设如果我们收到 SIGINT 信号,我们应该打印“Recieved Signal”。如果在十秒内处理程序收到另一个信号,它应该打印“Shutting Down”,然后以状态 1 退出。

我的代码是这样的:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void  handler(int);
void  secondhandler(int);
void  alrmhandler(int);

void alrmhandler (int alrmsig)
{  
  alarm(0);     
}

void secondhandler(int sig)
{
 /* after recieving second signal prints shutting down and exit */
 printf("Shutting Down\n");
 exit(1);
}

void handler ( int sig )  
{  
   /* recieve first SIGINT signal */
   printf ("Recieved Signal\n");
   /* handle for the alarm function */
   signal(SIGALRM, alrmhandler);
   /* start 10s alarm */
    alarm(10);
   /* catch second SIGINT signal within 10s*/
   signal(SIGINT, secondhandler);

 }



 int main( void )
 {
  signal(SIGINT, handler);
      printf( "Hello World!\n" );
  for ( ;; )
  {
    /* infinite loop */
  }

  return 0;
 }

我试图用 dev c++ 编译它,但它失败了。因为 SIGALRM 未声明(在此函数中首次使用)。

无论如何,我想知道的是这段代码是否正确。我实际上有点不确定 alrmhandler()。我应该忽略 SIGALRM 吗?

4

2 回答 2

3

如果您在 Windows 平台上,您将能够发送的唯一信号是:SIGABRT、SIGFPE、SIGILL、SIGINT、SIGSEGV 或 SIGTERM。

于 2011-12-01T15:12:04.390 回答
1

你写:

我想知道的是这段代码是否正确。

不是完全。printf() 不是async-signal-safe,因此不应从信号处理程序中调用,除非您非常确定这样做是安全的。在您提供的代码中这样做是不安全的。

alarm() 技术通常具有竞争倾向。您的 10 秒警报可能会在您的 secondhandler() 函数中间到期。为了防止这种情况,您可以屏蔽信号以使用更复杂的信号处理函数进行补偿。

有更优雅/灵活的方式来实现您想要的超时,但这可能是一个更适合codereview.stackexchange.com的问题。

于 2013-05-03T03:08:38.180 回答