Я не знаю о вашей программе, но это работает для меня (код взят из здесь ):
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void catch_alarm (int sig);
void setupAlarm();
/* This flag controls termination of the main loop. */
volatile sig_atomic_t keep_going = 4;
/* The signal handler just clears the flag and re-enables itself. */
void catch_alarm (int sig) {
keep_going--;
printf("Alarm!!\n");
if (keep_going) {
setupAlarm();
}
}
void setupAlarm() {
alarm(1);
sleep(1);
}
int main (int argc, char **argv) {
signal(SIGALRM, catch_alarm);
setupAlarm();
return EXIT_SUCCESS;
}
Это напечатает четыре Alarm!
и выйдет.
Вы можете заменить sleep(1);
на while (keep_going);
в main
для того же результата.
Проблема в том, что alarm
не выполняется внутри идентификатора процесса вашей программы, поэтому ваша программа может завершиться независимо от того, сработал сигнал тревоги или нет. Однако sleep
переводит процесс вашей программы в , удерживает в течение n секунд, затем продолжает. Без какого-либо способа «приостановить» процесс или сохранить процесс живым в ожидании тревоги, он просто умрет, выполнив все, что должно было быть выполнено. Даже используя поток, без sleep()
, while (...)
и т. Д. и a pthread_join()
, процесс не будет ждать вашего сигнала тревоги и просто завершится (умрет). Поэтому вам нужно каким-то образом поддерживать процесс в ожидании запуска сигнала, иначе он не будет работать.