2012-01-12 3 views
2

SIGALRM을 반복적으로 설정하고 해제 될 때까지 기다렸다가 다시 시도하고 싶습니다.SIGALRM을 반복하는 방법은 무엇입니까?

void handler(int signum) 
{ 
    struct itimerval timer; 
    struct sigaction sa; 

    sa.sa_handler = handler; 

    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_usec = 0; 
    timer.it_value.tv_usec = 0; 
    timer.it_value.tv_sec = 1000; 

    sigaction(SIGALRM, &sa, 0); 
    setitimer(ITIMER_REAL, &timer, 0); 

    printf("pause for me\n"); 
    pause(); 
} 

을 내 주에 내가 가진 : 내 핸들러 함수에서 나는이

int main(void) 
{ 
    handler(0); 
    return 0; 
} 

그러나이하는 모든 반복 한 후 두 번 포장 마차입니다. 나는 그것을 반복하기를 원한다. 뭐가 문제 야?

+0

신호 처리기에서'setitimer'를 사용하는 것이 안전합니까? 하지만 아마도 여기 괜찮을 것입니다. –

+0

그러나'timer_settime()'은 [ok]입니다 (http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html). –

답변

4

struct sigaction에는 초기화하지 않는 여러 필드가 있습니다. 처음 몇 번 작동하는 스택 쓰레기가 작동 한 다음 핸들러가 설치되지 않은 경우에 충돌합니다. sigaction() 반품을 테스트해야합니다. -1을 얻을 때 errno을 포함한 메시지를 인쇄하십시오.

sigaction()으로 전화해야합니다 (main() 또는 그 유사). SA_RESETHAND 플래그를 설정하지 않으면 "고정"됩니다. 그러면 다른 기존 코드가 제대로 작동 할 것입니다. 즉시 때 현재 화재를 시작합니다 있도록 struct itimervalit_interval 당신이 다음 타이머 값을 설정할 수있는 활용해야보다 정확한 반복 타이밍에 대한

.

관련 문제