scanf и обработчик сигналов

Просто узнал о сигасификации, также реализовал еще один таймер, чтобы сделать его более интересным.

#include  #include  #include  volatile sig_atomic_t gotsignal; void handler(){ gotsignal = 1; } int main(){ struct sigaction sig; struct itimerval timer; timer.it_value.tv_sec = 5; timer.it_value.tv_usec = 0; timer.it_interval = timer.it_value; sig.sa_handler = handler; sig.sa_flags = 0; sigemptyset(&sig.sa_mask); setitimer(ITIMER_REAL, &timer, 0); sigaction(SIGALRM, &sig, NULL); int value, y = 100, x=0; while(!gotsignal && x < y){ printf("Insert a value: \n"); scanf("%d", &value); x+=value; printf("Current x value: %d\n", x); } } 

Я не понимаю, когда он ждет ввода пользователя, и я пишу 5, но не нажимаю enter. Он все еще читает? Разве он не должен его очищать? Результат, который он мне дал:

 Insert a value: 1 Current x value: 1 Insert a value: 2 Current x value: 3 Insert a value: 5Current x value: 5 

Я бы хотел:

 Insert a value: 1 Current x value: 1 Insert a value: 2 Current x value: 3 Insert a value: 5(Wthout pressing enter!)Current x value: 3 (He would forget about 5 no?) 

A (педантично) правильный обработчик сигнала может делать очень мало вещей: особенно установка volatile sig_atomic_t переменной volatile sig_atomic_t (это некоторый целочисленный тип) и, возможно, вызов siglongjmp [я даже не уверен в siglongjmp ].

Итак, сначала объявляйте

 volatile sig_atomic_t gotsignal; 

то ваш обработчик сигнала просто

 void handler (void) { gotsignal = 1; } 

и ваша петля

 while(!gotsignal && x < y){ printf("Insert a value: \n"); scanf("%d", &value); x+=value; } 

Не забывайте, что асинхронные сигналы происходят в любое время (любая машинная инструкция !!!), в том числе внутри malloc или printf . Никогда не вызывать эти функции изнутри обработчика.

Ошибки, связанные с плохой обработкой сигналов, трудно отлаживать : они не воспроизводятся !

Подумайте, возможно, используя sigaction .