scanf循环和信号处理器
刚刚了解了sigacation,还实现了另一个计时器,使它更有趣scanf循环和信号处理器,c,loops,while-loop,signals,scanf,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; t
#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);
}
}
我想要的是:
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?)
一个(学究式的)正确的处理程序可以做的事情很少:特别是设置一个易失性sig_原子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;
}
while(!gotsignal&&x
不要忘记异步信号在任何时候都会发生(任何机器指令!!!),包括内部malloc
或printf
。永远不要从处理程序内部调用这些函数
与错误信号处理相关的错误很难调试:它们是不可复制的
考虑使用。一个(学究式)正确的处理程序可以做的事情很少:特别是设置一个易失性sig_原子\u 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;
}
while(!gotsignal&&x
不要忘记异步信号在任何时候都会发生(任何机器指令!!!),包括内部malloc
或printf
。永远不要从处理程序内部调用这些函数
与错误信号处理相关的错误很难调试:它们是不可复制的
考虑使用。Hmmm。这是有道理的。但是如果我想让程序在信号发出后停止等待扫描呢。例如,一旦收到信号,他就会忘记正在等待的扫描,并正常重启循环。这可能吗?我认为
SIGALRM
信号将停止scanf
,因为read
系统调用(由scanf
调用)将得到EINTR
错误。您可能还想了解select
、pselect
或poll
(或ppoll
)系统调用。您可以测试scanf
是否因其返回值而失败。+1还建议sigaction
,这与signal
不同,完全符合POSIX。@BasileStrynkevitch刚刚编辑了起始帖子,您认为您还可以帮我吗?从终端读取的细节很复杂,因为它是tty See&所以您可能希望使用readline或ncurses libraries.Hmmm。这是有道理的。但是如果我想让程序在信号发出后停止等待扫描呢。例如,一旦收到信号,他就会忘记正在等待的扫描,并正常重启循环。这可能吗?我认为SIGALRM
信号将停止scanf
,因为read
系统调用(由scanf
调用)将得到EINTR
错误。您可能还想了解select
、pselect
或poll
(或ppoll
)系统调用。您可以测试scanf
是否因其返回值而失败。+1还建议sigaction
,这与signal
不同,完全符合POSIX。@BasileStrynkevitch刚刚编辑了起始帖子,您认为您还可以帮我吗?从终端读取的细节很复杂,因为它是tty-See&所以您可能希望使用readline或ncurses库。