2016-08-28 10 views
1

epoll 및 timerfd linux API로 타이머 이벤트 루프를 작성했습니다. timerfd_gettime의 magpage는 내용의 다음 타이머가 현재 무장 경우에 따라서 time_t가 0인지 확인하십시오.

The it_value field returns the amount of time until the timer will 
next expire. If both fields of this structure are zero, then the 
timer is currently disarmed. 

확인하거나 내가 쓴 무장 해제 다음 코드를

bool timer_is_running(struct timer *timer) 
{ 
    struct itimerspec timerspec; 

    if(timerfd_gettime(timer->_timer_fd, &timerspec) == -1) { 
     printf("[TIMER] Could not get timer '%s' running status\n", timer->name); 
     return false; 
    } 

    printf("[TIMER] Checking running state of timer '%s' it_value.tv_sec = %"PRIu64", it_value.tv_nsec = %"PRIu64"\n", timer->name, (uint64_t) timerspec.it_value.tv_sec, (uint64_t) timerspec.it_value.tv_nsec == 0); 
    return timerspec.it_value.tv_sec != 0 && timerspec.it_value.tv_nsec != 0; 
} 

이 작동하지 않는 및 모든 타이머가보고되었다 무장 해제.

[TIMER] Checking running state of timer 'test' it_value.tv_sec = 0, it_value.tv_nsec = 4302591840 

추가 조사 후에 만 ​​tv_sec 필드가 무장 해제 타이머를 0으로 설정 보인다 내가 출력에서 ​​보았을 때 나는 현재 무장 해제 타이머 다음 보았다.

이 프로그램은 MIPS 아키텍처 (OpenWRT)에서 커널 3.18.23에서 실행됩니다.

커널 구현에서 버그로 표시하기 전에 time_t == 0을 수행하여 time_t이 0인지 확인하는 것이 올바른지 알고 싶습니다. 아무도 이것을 확인할 수 있습니까?

종류와 관련, Daan

+1

'& |'이 아닌 반환 된 표현식에'||'를 사용하십시오. – Peter

+0

세 번째 인수는'timerspec.it_value.tv_nsec == 0'입니까? 타이머가 값을 가질 때 이것은 '0'으로 평가 될 것입니다. 필자는 형식 지정과 일치하는 64 비트 값이 아니기 때문에 묻습니다. –

답변

3

이것은 커널 구현의 버그가 아닙니다. 결함이있는 코드입니다.

it_value 필드는 타이머가 다음 만료 될 때까지의 시간을 반환합니다. 이 구조체의 두 필드가 모두 0이면 현재 타이머가 해제됩니다.

이 반대의 타이머가 활성화 된 경우 ONE 또는 구조의 필드를 모두 비 제로인 (호출이 성공 timerfd_gettime()를 가정 할 때)이다.

함수의 마지막 return 문은 필드 둘 다 0이 아닌 있습니다 true 경우에만 반환

return timerspec.it_value.tv_sec != 0 && timerspec.it_value.tv_nsec != 0; 

입니다.대신, 당신은 사용해야합니다

return timerspec.it_value.tv_sec != 0 || timerspec.it_value.tv_nsec != 0; 
+0

대단히 감사합니다. 이제'time_t'를'uint64_t'로 캐스팅 한 printf 문이 제대로 작동하지 않아 오해했습니다. –

3

time_t 타입 별칭은 산술 또는 실제 유형입니다. 산술 및 실수 형 모두 암시 적으로 정수 값 0과 비교할 수 있습니다.

또한, (리눅스 등) POSIX 시스템에서 time_t 정수로서 정의된다 (예를 들어 this <sys/types.h> reference 참조).

C 표준은 time_t의 유형을 명시 적으로 지정하지 않지만 호환성 측면에서 모든 구현에서 time_t의 정수를 사용합니다. 나는 그것이 정수가 아닌 구현을 모른다.

그래서 귀하의 질문에 대한 답변은 비교가 정확하다는 것입니다.

time_t 유형의 사람은 tv_sec뿐입니다. tv_nsec 회원은 long입니다.