728x90

현재 시간을 알기 위해 gettimeofday()의 사용법을 찾던 중 clock_gettime()을 접했습니다. 알고 보니 gettimeofday()는 이미 POSIX.1-2008에서 구식(obsolescent) 함수로 지정되었더군요. 당장 gettimeofday()가 삭제되는 건 아니지만 향후 지원이 중단될 가능성이 있으니 대신 clock_gettime()을 사용해야겠습니다.


clock_gettime()

clock_gettime()은 time.h에 정의되어있습니다. 사용하려면 컴파일 옵션에 -lrt를 넣어줘야 합니다. 형태는 다음과 같습니다.

1
int clock_gettime(clockid_t clock_id, struct timespec *tp);

POSIX에선 clock_id의 값으로 한 가지 값을 기본으로 정의해두었습니다. 실제 시스템에선 이보다 더 다양할 수 있습니다.

CLOCK_REALTIME

- 시스템의 실제 시간입니다.

시스템에 따라 추가로 사용할 수 있는 값은 다음과 같습니다.

CLOCK_MONOTONIC

- 특정 시간, 예를 들면 시스템 시작 시간이나 Epoch 등등으로부터 흐른 시간입니다.

CLOCK_PROCESS_CPUTIME_ID

- 프로세스가 CPU를 사용한 시간입니다.

CLOCK_THREAD_CPUTIME_ID

- 스레드가 CPU를 사용한 시간입니다.

여기서 CLOCK_REALTIME을 사용하면 gettimeofday()와 같은 동작을 얻을 수 있습니다. 이때 얻은 시간 struct timespec은 다음과 같습니다.

1
2
3
4
struct timespec {
    time_t tv_sec
    long tv_nsec
}

gettimeofday()와는 달리 나노초 단위까지 얻을 수 있는 걸 볼 수 있습니다. 다만 시스템에 따라 나노초 정확도를 지원하지 않을 수도 있습니다. 이는 clock_getres()로 확인하시면 됩니다.

실제로 사용해보겠습니다.

1
2
3
4
5
6
7
8
9
10
int main( void) {
    struct timespec time;
    if ( 0 == clock_gettime( CLOCK_REALTIME, &time)) {
        printf( "tv_sec: %ld\ntv_nsec: %ld", time.tv_sec, time.tv_nsec);
    } else {
        fprintf( stderr, "Something wrong on clock_gettime()\n");
    }
 
    return 0;
}


+ Recent posts