극히 개인적이고 극히 대단하지 않은

시간 변경에 민감한 프로그래밍에 사용하는 clock_gettime 함수 본문

20년차 개발자

시간 변경에 민감한 프로그래밍에 사용하는 clock_gettime 함수

회색싼타 2019. 5. 15. 15:59

일반적으로 시각정보를 얻기위해 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 구조체에 대한 포인터를 지정하면 거기에 담아서 반환해 준다.

 

 

Comments