Проблема в том, что сигнал также сбрасывает механизм обработки сигнала, вы должны сбросить sigint в качестве обработчика сигнала.Из руководства
В исходных системах UNIX, когда обработчик, который был установлен с помощью signal (), был вызван доставкой сигнала, расположение сигнала будет сброшено до SIG_DFL, иСистема не блокировала доставку дальнейших экземпляров сигнала.Система V также предоставляет эту семантику для signal ().Это было плохо, потому что сигнал мог быть доставлен снова, прежде чем у обработчика была возможность восстановить себя.Кроме того, быстрая доставка одного и того же сигнала может привести к рекурсивным вызовам обработчика.
Вот как это сделать со старым устаревшим вызовом signal ().Обратите внимание, что int_stage и got_signal должны быть sig_atomic_t.Вы также можете вызывать только асинхронные безопасные функции, посмотрите список здесь .
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
sig_atomic_t int_stage = 0;
sig_atomic_t got_signal = 0;
void sigint(int parameter)
{
(void)parameter;
got_signal = 1;
int_stage++;
}
int main()
{
signal(SIGINT,sigint);
while(1)
{
if (got_signal)
{
signal(SIGINT,sigint);
got_signal = 0;
puts("still alive");
if (int_stage >= 5) exit(1);
}
}
return 0;
}
Пожалуйста, рассмотрите возможность использования sigaction или sigwait.
Sigaction практическита же идея, но не чепуха с повторной инициализацией обработчика сигнала.Sigwait остановит ваш поток, пока не будет получен сигнал.Таким образом, для sigwait, вы можете вызвать любую функцию или иметь дело с любыми данными.Я могу показать вам пример кода, если вы хотите.