일상 메모장

clock_gettime 사용법 (리눅스 정밀한 시간 얻어오기) 본문

C 언어

clock_gettime 사용법 (리눅스 정밀한 시간 얻어오기)

핸드오버 2020. 2. 26. 07:02

사용법

#include <time.h>

int clock_gettime(clockid_t clk_id, struct timespec *tp);
//Link with -lrt (only for glibc version before 2.17)

정의

clock_gettime()함수는 clk_id 에 따른 시간을 나타냅니다. 

tp 아규먼트는 timespec 구조체를 사용하고 이는 <time.h>에 정의되어 있습니다.

struct timespec {
        time_t    tv_sec;      /* seconds */
        long      tv_nsec;     /* nanoseconds */
};

clk_id 아규먼트는 특수한 클럭에 대해서 정의되어 있습니다.

모든 구현은 시스템전체의 실시간 클럭을 지원합니다.

실시간 클럭은 CLOCK_REALTIME에 의해 실행됩니다. 시간은 초와 나노초를 나타냅니다.

nanosecond 는 1,000,000,000 가 1초인 시간입니다.

microsecond 는 1,000,000 가 1초인 시간입니다.

millisecond 는 1,000 가 1초인 시간입니다.

 

최근 clk_id 아규먼트 종류는 아래와 같습니다.

  • CLOCK_REALTIME
    • 시스템 전역의 실제 시간입니다.
  • CLOCK_REALTIME_COARSE
    • 시스템 전역의 실제시간인데, CLOCK_REALTIME 보다 실행시간이 많이 빠릅니다.
    • 정확도가 떨어지는 대신 매우 빠른 function call 을 하고싶다면 이 아규먼트를 사용하면 됩니다.
  • CLOCK_MONOTONIC
    • 단조 시계로 특정시간부터 흐른 시간을 측정합니다. (일반적으로 부팅이후 시간)
    • 시스템 관리자는 이 값을 초기화 할수 있습니다.
  • CLOCK_MONOTONIC_COARSE
    • 같은 단조 시계인데 매우 빠릅니다. 정확도가 떨어지는 대신 매우빠른 단조시계를 사용하려면 이 아규먼트를 사용하세요.
  • CLOCK_MONOTONIC_RAW
    • 위와 비슷하지만 NTP 조정이나 adjtime(3)에 대한 조정에 영향을 받지 않는 하드웨어 기반시간에 대한 접근을 제공합니다. 시스템이 절전 대기 시간은 포함하지 않습니다.
  • CLOCK_BOOTTIME
    • 위와 비슷하지만 시스템의 절전 대기 시간도 포함하는 시간입니다.
  • CLOCK_PROCESS_CPUTIME_ID
    • 프로세스별 cpu 시간 클럭. 프로세스내 모든 쓰레드들이 소모한 CPU 시간을 나타냅니다.
  • CLOCK_THREAD_CPUTIME_ID
    • 특정 쓰레드 한정 CPU 시간 클럭

반환 값

clock_gettime() 이 성공하면 0을 리턴하고, 실패하면 -1을 리턴합니다.

(errno 값이 셋팅되어집니다.)

에러값

  • EFAULT
    • tp 주소가 접근가능한 주소 공간 밖을 가르키고 있는경우.
  • EINVAL
    • clk_id 값이 이 시스템에서 지원하지 않는 값일 경우.
  • EPERM
    • clock_settime() 에서 클럭을 설정한 권한이 없는 경우.