我希望我的程序循环运行,直到它收到一个报警信号,同时我想在每次收到一个中断信号时运行一些代码。
以下几乎可以工作:
bool volatile waiting = true;
bool volatile interrupted = false;
void catch_interrupt(int x)
{
interrupted = true;
}
void catch_alarm(int x)
{
waiting = false;
}
void alive()
{
signal(SIGINT, catch_interrupt);
signal(SIGALRM, catch_alarm);
alarm(10);
while (waiting)
{
if (interrupted)
{
printf("interrupted\n");
interrupted = false;
}
}
printf("done\n");
}
问题是它只对第一个中断信号有效。无论如何,第二个中断会终止程序(不打印“完成”)。
所以我看到的输出是
^Cinterrupted
^C
想看的时候
^Cinterrupted
^Cinterrupted
done
最佳答案
不要使用 signal()
来安装自定义信号处理程序,因为它在这种情况下的行为因实现而异。特别是,在某些系统上,如果 signal()
用于为给定信号设置自定义信号处理程序,则在收到信号时会重置该信号的配置。这就是您似乎正在观察的内容,但您不能轻而易举地依赖它。
相反,通过 sigaction()
安装信号处理程序。除其他事项外,它具有一种机制,用于指定是否应在收到信号后重置处理程序。
关于不能捕获多个中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39280356/