不能捕获多个中断

标签 c signals

我希望我的程序循环运行,直到它收到一个报警信号,同时我想在每次收到一个中断信号时运行一些代码。

以下几乎可以工作:

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/

相关文章:

c - 减去循环元素

c - sscanf 用法 - 如何验证完成的扫描与中止的扫描

c - C语言中unsigned和unsigned int的区别

c - Valgrind 看不到 -g 文件中的行

c - 如何让信号处理程序打印时间已过?

c - 这段代码有没有逻辑错误?

c - POSIX 计时器以预期频率的两倍运行

C - 检查是否分配了 Integer

c - 虽然没有收到信号?

c - 父进程在 Linux shell 上等待上一个子进程