2011-11-26 4 views
0

그냥 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?) 

답변

3

원래 올바른 signal 핸들러가 거의 일을 할 수 출력이 내게 준 어떤 정수형), 아마도 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; 
} 

입니다 선언 (임의 ma 중국 안내 !!!), malloc 또는 printf을 포함합니다. 처리기 내부에서 이러한 함수를 호출하지 마십시오. 나쁜 신호 처리와 관련된

버그를 디버깅하기 어려운 : 그들은 재현하지 있습니다!

아마도 sigaction을 사용해보십시오.

+0

흠. 그건 의미가 있습니다. 그러나 프로그램이 신호 다음에 scanf를 기다리는 것을 멈추게하려면 어떻게해야할까요? 예를 들어 신호를 받자 마자 기다리는 scanf를 잊어 버리고 정상적으로 루프를 다시 시작합니다. 그게 가능하니? – JPS

+0

'SIGALRM' 신호는'scanf '를 멈추게 할 것입니다. 왜냐하면'read' 시스템 호출 ('scanf'에 의해 호출 됨)은'EINTR' 오류를 낳을 것이기 때문입니다. 'select','pselect' 또는'poll' (또는'ppoll') 시스템 호출에 대해서도 배우고 싶을 것입니다. scanf가 반환 된 값으로 실패했는지 테스트 할 수있다. –

+0

+1 또한'signal '과는 달리'sigaction'이 완전히 POSIX를 따르고 있음을 암시합니다. – jweyrich