시간 변경에 민감한 프로그래밍에 사용하는 clock_gettime 함수
일반적으로 시각정보를 얻기위해 gettimeofday, time, localtime 등의 함수를 많이 쓰게 되는데, 이 함수들은 기본적으로 과거의 특정시점(1970년 1월1일 0시)을 기준으로 시간 값을 얻어오기 때문에, 두 시점의 시간 간격을 측정하여 동작을 하는 프로그램에 있어서 시각이 변경되면 절대적 시간 간격을 측정할 수가 없게되고 이로 인하여 원하지 않는 오류가 발생할 수 있다.
예를 들어 사용자의 사용시간에 따라 과금을 하는 프로그램이 있는데, 사용자는 1시간을 사용을 했지만, 사용시간 중에 시각을 30분 앞으로 당겼다면, 이 사용자는 30분만 사용한 것으로 과금이 될 것이다.
이런 오류를 극복하기 위하여 clock_gettime 함수를 사용하면 된다.
clock_gettime의 prototype은 다음과 같다.
#include <time.h>
int clock_gettime(clockid_t clock_id, struct timespec *tp);
struct timespec
{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
첫번째 파라미터인 clock_id는 아래의 4개의 값들 중 하나를 선택할 수 있는데, 그 의미는 다음과 같다.
clock_id | 동작 | |
CLOCK_REALTIME | 특정시각으로부터 절대적 시각. | |
CLOCK_MONOTONIC | 특정시각으로부터 상대적 시각. 일반적으로 시스템 부팅시점 이후 흐른 시각 | |
CLOCK_PROCESS_CPUTIME_ID | 프로세서 단위 CPU 사용시각 | |
CLOCK_THREAD_CPUTIME_ID | 쓰레드 단위 CPU 사용시각 |
CLOCK_REALTIME 파라미터로 사용하면 gettimeofday와 동일하다.
CLOCK_MOMOTONIC 파라미터로 사용하면, 시스템 부팅시간 기준으로 경과된 시간을 가져오기 때문에, NTP나 기타 time 명령으로 시스템의 시각이 바뀌어도 일정한 시간 간격을 측정할 수 있다.
clock_id 파라미터에 따라 시각 정보는 timespec 구조체에 대한 포인터를 지정하면 거기에 담아서 반환해 준다.