Простые сигналы - программирование на C и функция сигнализации
#include <stdio.h>
#include <signal.h>
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"
Любая идея, что происходит?
Ответы
Ответ 1
Вы забываете сначала установить обработчик будильника. Измените начало 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
.
Ответ 2
Вы не устанавливаете обработчик в своей функции main
.
Прежде чем вы выполните alarm(2)
, поместите signal(SIGALRM, ALARMhandler);
в свой main
.
Затем он должен работать.
Обратите внимание, что ваш "All Done" никогда не будет напечатан, потому что вы останетесь в цикле while (1) после запуска процессора сигналов. Если вы хотите, чтобы цикл был сломан, вам нужно будет иметь флаг, который изменит обработчик сигнала.
#include <stdio.h>
#include <signal.h>
/* 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;
}
Ответ 3
Вы не устанавливаете обработчик сигналов в первую очередь.
Вам нужно сообщить системе, что вы хотите обработать сигнал, прежде чем принимать его, поэтому вам нужно вызвать signal()
от основного до появления сигнала.
int main(int argc, char *argv[])
{
signal(SIGALRM, ALARMhandler); /* install the handler */
alarm(2); /* set alarm clock */
while (1);
}
Ответ 4
Андомар строгий. Я проверяю это и,
Версия 1 печатает (каждую секунду):
Hi...
Hi...
Hi...
Hi...
BYE
Hi...
...
версия 2 (каждые пять секунд):
Hi...Hi...Hi...Hi...BYE
Hi...Hi...Hi...Hi...BYE
...
Итак, код:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
# 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);
}