Ух, путь слишком много кода, чтобы его просеять. Однако, если вы используете стандартную библиотеку C, вы должны получить желаемое поведение. Вот версия C ++:
#include <iostream>
#include <csignal>
sig_atomic_t sigflag = 0;
void sighandler(int s)
{
// std::cerr << "Caught signal " << s << ".\n"; // this is undefined behaviour
sigflag = 1; // something like that
}
int main()
{
std::signal(SIGINT, sighandler);
// ... your program here ...
// example: baby's first loop (Ctrl-D to end)
char c;
while (std::cin >> c)
{
if (sigflag != 0) { std::cerr << "Signal!\n"; sigflag = 0; }
}
}
Это поймает Ctrl-C
(что поднимает SIGINT
), и обработчик сигнала не заменяется, поэтому он будет срабатывать каждый раз, и никто не завершает программу.
Обратите внимание, что обработчики сигналов наследуются fork()
ed дочерними элементами.
Функция Posix sigaction()
позволяет регистрировать обработчики «одного выстрела», которые заменяются стандартным обработчиком после их вызова один раз. Хотя это более продвинутое и специфичное для Posix.
Редактировать: Как указывает @Dietrich, вы никогда не должны выполнять никакой реальной работы внутри обработчика сигнала. Скорее, вы должны установить флаг (я привел пример) и проверить этот флаг внутри вашего цикла (и напечатать сообщение там). Я тоже исправлю пример для этого.