我有一个关于处理信号的问题。 假设如果我们收到
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
吗?
如果您使用的是 Windows 平台,则您能够发送的唯一信号是:SIGABRT、SIGFPE、SIGILL、SIGINT、SIGSEGV 或 SIGTERM。
你写道:
我想知道的是这段代码是否正确。
不完全是。 printf() 不是“异步信号安全”,因此不应从信号处理程序中调用,除非您非常确定这样做是安全的。 在您提供的代码中这样做不安全。 alarm() 技术通常容易出现竞争。 您的十秒警报可能会在 secondaryhandler() 函数执行过程中到期。 为了防止这种情况,您可以屏蔽信号以使用
更复杂的信号处理函数codereview.stackexchange.com