Я играю с обработкой сигналов в 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, но не смог сработать.
Спасибо