цикл scanf и обработчик сигнала - PullRequest
0 голосов
/ 27 ноября 2011

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

#include <stdio.h>
#include <signal.h> 
#include <sys/time.h>

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, но не нажимаю ввод. Он все еще читает это? Разве он не должен очистить это? Вывод это дало мне:

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?)

1 Ответ

3 голосов
/ 27 ноября 2011

A (педантично) правильный сигнал обработчик может сделать очень мало вещей: в частности, установить переменную 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 .

...