处理多个信号

问题描述 投票:0回答:2

我有一个关于处理信号的问题。 假设如果我们收到

SIGINT
信号,我们应该打印“Received Signal”。如果处理程序在十秒内收到另一个信号,它应该打印“正在关闭”,然后以状态 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 )  
{  
   /* receive first SIGINT signal */
   printf ("Received 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
吗?

c signals signal-handling
2个回答
4
投票

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


1
投票

你写道:

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

不完全是。 printf() 不是“异步信号安全”,因此不应从信号处理程序中调用,除非您非常确定这样做是安全的。 在您提供的代码中这样做安全。 alarm() 技术通常容易出现竞争。 您的十秒警报可能会在 secondaryhandler() 函数执行过程中到期。 为了防止这种情况,您可以屏蔽信号以使用

更复杂的信号处理函数

进行补偿。 有更优雅/灵活的方法来实现您想要的超时,但这可能是一个更适合

codereview.stackexchange.com

的问题。

© www.soinside.com 2019 - 2024. All rights reserved.