2012-04-26 10 views
2

SIGVTALRMsetitimer으로 보내려고하는데 왜 작동하지 않는지 잘 모릅니다.SIGVTALRM 신호를 수신 중입니다.

void time(int time) { 
    cout << "time" << endl; 
    exit(0); 
} 

int main(void) { 
    signal(SIGVTALRM, time); 
    itimerval tv; 
    tv.it_value.tv_sec = 5; 
    tv.it_value.tv_usec = 0; 
    tv.it_interval.tv_sec = 5; 
    tv.it_interval.tv_usec = 0; 
    setitimer(ITIMER_VIRTUAL, &tv, NULL); 
    while (true) { 
     cout << "waiting" << endl; 
    } 
    return 0; 
} 

어떤 이유가 time() 호출되지 않습니다 - 그것은 신호를 잡을하지 않거나 신호가 처음에 전송되지 않았기 때문에 나도 몰라 때문이다 : 여기 내 코드입니다.

아주 간단해야합니다. 어떤 아이디어? 감사합니다

+0

당신이 "작동하지 않는"으로 무엇을 의미? 그것은 조금 일반 :) – Aslan986

+0

사실, 나는 질문을 편집했습니다. 그것은 결코 들어 가지 않습니다(), 그래서 나는 아마 신호를 잡아 내지 않는다고 생각합니다. – yotamoo

답변

0

정말 작동하지 않습니까?

모든 것이 잘 보입니다. 충분히 기다리지 않을 수도 있습니다. 루프 내에서 문자열 waiting을 인쇄 중이며 가상 타이머를 사용하고 있으므로 프로세스가 실행될 때만 (IO 시간은 포함되지 않음) 시계가 틱합니다. 따라서 실제로 타이머는 몇 초 (> 5) 후에 만료 될 수 있습니다.

인쇄 부분을 주석으로 처리하십시오.

0

이것은 signal 기능 때문입니다. http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html에서 언급 한 바와 같이 :

The behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. 

그래서 주요 방법은 다음과 같아야합니다

int main(void) { 
    itimerval tv; 
    struct sigaction sa; 

    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = 0; 
    sa.sa_handler = timer_handler; 
    if (sigaction(SIGVTALRM, &sa, NULL) == -1) { 
     printf("error with: sigaction\n"); 
     exit(EXIT_FAILURE); 
    } 

    tv.it_value.tv_sec = 5; 
    tv.it_value.tv_usec = 0; 
    tv.it_interval.tv_sec = 5; 
    tv.it_interval.tv_usec = 0; 
    setitimer(ITIMER_VIRTUAL, &tv, NULL); 

    while (true) { 
     cout << "waiting" << endl; 
    } 

    return 0; 
} 
관련 문제