struct sigaction
имеет несколько полей, которые вы не инициализируете. Мусорный стек, который вы получили первые несколько раз, работает, а затем вы сталкиваетесь с ситуацией, когда это не так, и ваш обработчик не установлен. Вы должны проверить возврат sigaction()
. Когда вы получите -1
, напечатайте сообщение, включающее errno
.
Вы должны позвонить sigaction()
один раз (с main()
или аналогичным). Он будет «прилипать», если вы не установите флаг SA_RESETHAND
. Тогда ваш другой существующий код, вероятно, будет работать.
Для более точного повторения времени вы должны воспользоваться struct itimerval
it_interval
, который позволяет вам установить значение таймера next , чтобы оно началось сразу после срабатывания текущего.