2011-12-01 70 views
4

我对处理信号有疑问。 假设如果我们收到SIGINT信号,我们应该打印“Recieved Signal”。如果10秒内处理临危另一个信号,它应打印“关机”,然后用状态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; 
} 

我试图与开发的C编译它++,但失败了。由于SIGALRM未声明(首次在此函数中使用)。

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

+1

将您的for循环内容更改为sleep(1);而不是将其设置为空,以便其他进程也有机会运行。 –

回答

3

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

+0

好的,thx。但如果我在linux中运行它,它应该工作,不是吗? – user1075627

+0

@ user1075627:是的,编译应该在Linux机器上工作,因为SIGALRM是在'signal.h'中定义的。 –

1

你写:

什么,我想知道的是,如果这个代码是正确的。

不完全。 printf()不是async-signal-safe,所以不应该在信号处理程序中调用,除非您确定这样做是安全的。它是而不是可以在您提供的代码中安全地执行此操作。报警()技术通常是种族倾向性的。您的十秒钟警报可能会在您的二手()函数的中间过期。为防止这种情况发生,您可能会掩盖掉信号以便用a more sophisticated signal manipulation function进行补偿。

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