scanf循环和信号处理器

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

刚刚了解了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);
}
}
我想要的是:

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库。