전통적으로 unix/linux에서 시각을 알아 내기 위해 time(), gmtime(), localtime(), ctime(), gettimeofday()등을 사용하였지만,
POSIX의 새로운 스펙에 따라 glibc는 다음과 같은 함수를 제공하고 있다.

     int clock_getres(clockid_t clk_id, struct timespec *res);
     int clock_gettime(clockid_t clk_id, struct timespec *tp);

clock_getres()와 gettimeofday()의 차이점은 clk_id의 사용에 있다.
clk_id는 리눅스에 내장되어 있는 다양한 시계(?!)를 참조하기 위한 아이디이다.
   1. CLOCK_REALTIME: 이것은 우리가 date커맨드에서 볼 수 있는 시계이며,
     시스템의 재설정에 의해 과거로 가거나 윤초에 의해 미래로 도약하는 wall-clock(벽걸이시계)이다.
     RTOS의 realtime이 아니라 일상/실제(real)생활에서 볼 수 있는 시계를 의미한다.

   2. CLOCK_MONOTONIC: 이 시계는 말그대로 단조롭게 증가하는 시계이며, REALTIME과 같이 시간의 점프가 없다.

   3. CLOCK_PROCESS_CPUTIME_ID: 프로세스의 시작시각으로부터 단조증가하여 프로세스의 사용시간에 따라 증가한다.


다음에서 함수의 사용예를 보인다.

time_func_1.png

 
CLOCK_REALTIME과 CLOCK_MONOTONIC의 time-resolution은 둘 다 1(ns)까지 나오는 것으로 보인다.

  time_func_3.png


다음과 같이 clock_gettime의 clk_id를 바꿔가면서 1초씩 쉬면서 5회 반복실행시켜 보기로 한다.
 time_func_4.png

time()의 반환값과 같이 CLOCK_REALTIME은 1970.1.1부터 시작하여 측정한 초를 표시하고 있다.

time_func_5.png


다음에 보이는 CLOCK_MONOTONIC는 /proc/uptime와 같이 시스템의 부팅시각으로부터 시작하고 있다.
time_func_6.png

CLOCK_PROCESS_CPUTIME_ID은 프로세스가 움직인 시간에 따라 증가하는 것으로 보인다.
time_func_7.png

CLOCK_REALTIME, CLOCK_MONOTONIC에는 타임측정정확도를 낮추는 대신 호출속도를 높이는 버젼의 clk_id가 있는 데,
각각 CLOCK_REALTIME_COARSE, CLOCK_MONOTONIC_COARSE이다. 다량의 timestamp를 찍는 서버와 같은 프로그램에서 사용할 수 있다.