강좌 & 팁
현재 시간을 알기 위해 gettimeofday()의 사용법을 찾던 중 clock_gettime()을 접했습니다. 알고 보니 gettimeofday()는 이미 POSIX.1-2008에서 구식(obsolescent) 함수로 지정되었더군요. 당장 gettimeofday()가 삭제되는 건 아니지만 향후 지원이 중단될 가능성이 있으니 대신 clock_gettime()을 사용해야겠습니다.
clock_gettime()은 time.h에 정의되어있습니다. 사용하려면 컴파일 옵션에 -lrt를 넣어줘야 합니다. 형태는 다음과 같습니다.
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은 다음과 같습니다.
struct timespec { time_t tv_sec long tv_nsec }
gettimeofday()와는 달리 나노초 단위까지 얻을 수 있는 걸 볼 수 있습니다. 다만 시스템에 따라 나노초 정확도를 지원하지 않을 수도 있습니다. 이는 clock_getres()로 확인하시면 됩니다.
실제로 사용해보겠습니다.
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; }