Can';t捕获多个中断

Can';t捕获多个中断,c,signals,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() {

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

以下几点几乎奏效:

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()
的信号处理程序将被解除。每次都必须重新启动信号:

void catch_interrupt(int x)
{
    interrupted = true; 
    signal(SIGINT, catch_interrupt);

}

void catch_alarm(int x)
{
    waiting = false;
    signal(SIGALRM, catch_alarm);
}

是的,这意味着当第一个信号已被处理,但处理程序尚未恢复时,存在一个小的漏洞窗口,因为第二个信号将导致程序作出反应,好像没有安装信号处理程序(因为没有安装信号处理程序)。

信号处理程序设置为
signal()
在响应信号调用信号处理程序时解除防护。每次都必须重新启动信号:

void catch_interrupt(int x)
{
    interrupted = true; 
    signal(SIGINT, catch_interrupt);

}

void catch_alarm(int x)
{
    waiting = false;
    signal(SIGALRM, catch_alarm);
}
是的,这意味着当第一个信号已被处理但处理程序尚未恢复时,存在一个小的漏洞窗口,因为第二个信号将导致程序作出反应,好像没有安装信号处理程序(因为没有安装信号处理程序)。

不要使用
信号()
安装自定义信号处理程序,因为在这种情况下,它的行为因实现而异。特别是,在某些系统上,如果使用
signal()
为给定信号设置自定义信号处理程序,则在接收到信号时会重置该信号的配置。这是你似乎正在观察的,但你不能依赖它

相反,通过
sigaction()
安装信号处理程序。除此之外,它还有一种机制,用于指定在收到信号时是否应重置处理程序。

不要使用
signal()
安装自定义信号处理程序,因为在这种情况下,它的行为因实现而异。特别是,在某些系统上,如果使用
signal()
为给定信号设置自定义信号处理程序,则在接收到信号时会重置该信号的配置。这是你似乎正在观察的,但你不能依赖它


相反,通过
sigaction()
安装信号处理程序。除此之外,它还有一种机制,用于指定在收到信号时是否应重置处理程序。

Ugh,我也这么怀疑。这是在哪里记录的?@Max Try
人工信号
。我的(Linux)手册页面非常清楚地描述了它。我不知道。我记得大约18年前,当我在旧的HP工作站上编写代码时,我注意到了这个问题。我们发现重新装好信号正是我们所期望的。胡萝卜加大棒学习:)约翰的答案可能更好,因为它还不到20岁。啊,我也这么怀疑。这是在哪里记录的?@Max Try
人工信号
。我的(Linux)手册页面非常清楚地描述了它。我不知道。我记得大约18年前,当我在旧的HP工作站上编写代码时,我注意到了这个问题。我们发现重新装好信号正是我们所期望的。胡萝卜加大棒学习:)约翰的答案可能更好,因为它还不到20岁。