Простые сигналы – программирование на C и функция сигнализации

#include  #include  void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf("Hello"); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ } int main(int argc, char *argv[]) { alarm(2); /* set alarm clock */ while (1) ; printf("All done"); } 

Я ожидаю, что программа будет печатать «привет» через 2 секунды, но вместо этого выход будет «zsh: alarm ./a.out»

Любая идея, что происходит?

Вы забываете сначала установить обработчик будильника. Измените начало main() как:

 int main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); ... 

Кроме того, обработчик сигнала, вероятно, ничего не напечатает. Это связано с тем, что библиотека C кэширует выходные данные до тех пор, пока не увидит конец строки. Так:

 void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf("Hello\n"); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ } 

Для реальной программы печать из обработчика сигнала не очень безопасна. Обработчик сигнала должен делать все, что может, желательно только устанавливать флаг здесь или там. И флаг должен быть объявлен volatile .

Вы не устанавливаете обработчик в своей main функции.

Перед выполнением alarm(2) поставьте signal(SIGALRM, ALARMhandler); в вашем main .

Тогда он должен работать.

Обратите внимание, что ваш «All Done» никогда не будет напечатан, потому что вы останетесь в цикле while (1) после запуска процессора сигналов. Если вы хотите, чтобы цикл был сломан, вам понадобится флаг, который обработчик сигнала изменится.

 #include  #include  /* number of times the handle will run: */ volatile int breakflag = 3; void handle(int sig) { printf("Hello\n"); --breakflag; alarm(1); } int main() { signal(SIGALRM, handle); alarm(1); while(breakflag) { sleep(1); } printf("done\n"); return 0; } 

Сначала вы не устанавливаете обработчик сигналов.
Вам нужно сообщить системе, что вы хотите обработать сигнал, прежде чем принимать его, поэтому вам нужно вызывать signal() от основного до того, как поступит сигнал.

 int main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); /* install the handler */ alarm(2); /* set alarm clock */ while (1); } 

Андомар строг. Я тестирую это и, версия 1 печатает (каждую секунду):

 Hi... Hi... Hi... Hi... BYE Hi... ... 

печать версии 2 (каждые пять секунд):

 Hi...Hi...Hi...Hi...BYE Hi...Hi...Hi...Hi...BYE ... 

Таким образом, код:

 #include  #include  #include  # define T 5 int flag = T; void sigalrm_handler(int); int main(void) { signal(SIGALRM, sigalrm_handler); alarm(1); while (1); } void sigalrm_handler(int sig) { if(--flag){ printf("Hi...\n"); /*version 1*/ /*printf("Hi...");*/ /*version 2*/ }else{ printf("BYE\n"); flag=T; } alarm(1); }