c++ - 为什么我的信号处理程序只执行一次?

标签 c++ unix system-calls

我正在使用 UNIX 和 C++ 中的信号处理,并遇到了这个问题。我正在尝试编写一个计数到 10 的程序,每秒一个数字,当用户尝试使用 SIGINT(如 CTRL+C)中断它时,它会打印一条消息,告诉它无论如何都会继续计数。

到目前为止,我得到了这个:

#include <iostream>
#include <signal.h>
#include <zconf.h>

using namespace std;

sig_atomic_t they_want_to_interrupt = 0;
void sigint_handler(int signum) {
    assert(signum == SIGINT);
    they_want_to_interrupt = 1;
}

void register_handler() {
    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGINT);
    sa.sa_handler = sigint_handler;
    sigaction(SIGINT, &sa, 0);
}

int main() {
    register_handler();
    cout << "Hi! We'll count to a hundred no matter what" << endl;
    for (int i = 1; i <= 100; i++) {
        if (they_want_to_interrupt == 1) {
            cout << endl << "DON'T INTERRUPT ME WHILE I'M COUNTING! I'll count ALL THE WAY THROUGH!!!" << endl;
            they_want_to_interrupt = 0;
        }
        cout << i << " " << flush;
        sleep(1);
    }
    cout << "Done!" << endl;
    return 0;
}

现在,我第一次发送中断信号,它工作正常:

Hi! We'll count to a hundred no matter what
1 2 ^C
DON'T INTERRUPT ME WHILE I'M COUNTING! I'll count ALL THE WAY THROUGH!!!
3 4

但是如果我发送第二个中断信号,进程就会停止。

为什么会发生这种情况?我尝试阅读“sigaction”手册,试图看看是否有什么东西可以使我创建的处理程序在捕获信号时不会弹出并回滚到 SIG_DFL,但无法解决。

谢谢

最佳答案

每次发送信号时,您只需重置信号处理程序即可。我已经看到当可能会重复出现信号时处理 SIGUSR 的情况。

#include <iostream>
#include <cassert>
#include <signal.h>
#include <zconf.h>

using namespace std;

void register_handler();
sig_atomic_t they_want_to_interrupt = 0;
void sigint_handler(int signum) {
    assert(signum == SIGINT);
    they_want_to_interrupt = 1;
    register_handler();
}

void register_handler() {
    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGINT);
    sa.sa_handler = sigint_handler;
    sigaction(SIGINT, &sa, 0);
}

int main() {
    register_handler();
    cout << "Hi! We'll count to a hundred no matter what" << endl;
    for (int i = 1; i <= 100; i++) {
        if (they_want_to_interrupt == 1) {
            cout << endl << "DON'T INTERRUPT ME WHILE I'M COUNTING! I'll count ALL THE WAY THROUGH!!!" << endl;
            they_want_to_interrupt = 0;
        }
        cout << i << " " << flush;
        sleep(1);
    }
    cout << "Done!" << endl;
    return 0;
}

关于c++ - 为什么我的信号处理程序只执行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52471162/

相关文章:

C++ Unresolved token 问题

java - 将 Unix 日期从 php 转换为 Java (Android)

c - 在函数中调用 fork() 后主进程不打印

linux - 最大驻留集大小是什么意思?

gdb - 如何从 uImage (arm) 中提取内核符号?

assembly - 如何在汇编中将 RAX 中的值写入 STDOUT?

c++函数重新定义(代码不工作 - 逻辑错误)

c++ - 如何强制 Mac 窗口到前台?

c++ - Valgrind Massif工具部队快照

linux - 你如何比较 linux 中两列之间的条目?