scanf循环和信号处理程序

时间:2011-11-26 21:30:00

标签: c loops while-loop signals scanf

刚刚学习了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 个答案:

答案 0 :(得分:3)

(迂腐)正确的signal处理程序可以做很少的事情:特别是设置一个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;
}

不要忘记异步信号随时发生(任何机器指令!!!),包括mallocprintf内部。切勿在处理程序内调用这些函数。

与错误信号处理相关的错误很难调试:它们无法重现

考虑使用sigaction