그냥 sigacation에 대해 배웠고 더 재미있는 다른 타이머도 구현했습니다.scanf 루프 및 신호 처리기
#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를 쓰지만 enter를 누르지 않을 때입니다. 그는 아직도 그것을 읽는가? 그는 그것을 지워야하지 않습니까?
Insert a value:
1
Current x value: 1
Insert a value:
2
Current x value: 3
Insert a value:
5Current x value: 5
는 내가 같은 것 할 것 : 이것이 주목할 만하게 volatile sig_atomic_t
변수를 설정 ((pedantically)
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?)
흠. 그건 의미가 있습니다. 그러나 프로그램이 신호 다음에 scanf를 기다리는 것을 멈추게하려면 어떻게해야할까요? 예를 들어 신호를 받자 마자 기다리는 scanf를 잊어 버리고 정상적으로 루프를 다시 시작합니다. 그게 가능하니? – JPS
'SIGALRM' 신호는'scanf '를 멈추게 할 것입니다. 왜냐하면'read' 시스템 호출 ('scanf'에 의해 호출 됨)은'EINTR' 오류를 낳을 것이기 때문입니다. 'select','pselect' 또는'poll' (또는'ppoll') 시스템 호출에 대해서도 배우고 싶을 것입니다. scanf가 반환 된 값으로 실패했는지 테스트 할 수있다. –
+1 또한'signal '과는 달리'sigaction'이 완전히 POSIX를 따르고 있음을 암시합니다. – jweyrich