Проблема заключается в том, что сигнал также сбрасывает механизм обработки сигнала, вы должны сбросить SIGINT в качестве сигнала обработчик. Из ручного
В исходных системах UNIX, когда обработчик, который был установлен с использованием сигнала() был вызван с помощью доставки сигнала, расположение сигнала будет сбрасываются в SIG_DFL, и система не сделала блокировать доставку дополнительных экземпляров сигнала. Система V также предоставляет эту семантику для сигнала(). Это было плохо, потому что сигнал мог быть доставлен снова, прежде чем у обработчика появилась возможность восстановить себя. Более того, быстрые поставки одного и того же сигнала могут приводить к рекурсивным вызовам обработчика.
Это как сделать это со старым устаревшим сигналом() вызова. Обратите внимание, что int_stage и got_signal должны быть sig_atomic_t. Вы также можете вызывать только безопасные функции async, посмотрите на список here.
#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 остановит вашу нить до получения сигнала. Таким образом, для sigwait вы можете вызывать любую функцию или обрабатывать любые данные. Я могу показать вам пример кода, если вы хотите.
Вы должны использовать sig_atomic_t, а не ints для обработки сигналов. Если бы я был вами, я бы избегал всего этого беспорядка и просто использовал сигвайт. – Lalaland
@EthanSteinberg Uh? Прототипом функции является 'void (* func) (int))' в соответствии с C и POSIX. –
@Let_Me_Be: Я считаю, что Этан имеет в виду 'got_signal', а не параметр для вашего обработчика сигналов. – Mat