刚刚学习了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?)
答案 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;
}
不要忘记异步信号随时发生(任何机器指令!!!),包括malloc
或printf
内部。切勿在处理程序内调用这些函数。
与错误信号处理相关的错误很难调试:它们无法重现!
考虑使用sigaction。