일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ubuntu22.04
- 노트북 정보
- whatis
- 괌여행
- vi
- linux
- 인천
- 인화여고
- xshell4
- C
- 리눅스
- 괌
- host key
- IPv6
- vcore
- Listen
- 옛날 탕수육
- gdb tip
- 디버깅
- thread pid
- 출력
- kdumo
- core file
- spacse
- 칼국수
- 노트북 배터리 교체
- 꺠짐
- 다수 클라이언트
- hostkeyalgorithms
- ubuntu
- Today
- Total
극히 개인적이고 극히 대단하지 않은
시간 변경에 민감한 프로그래밍에 사용하는 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 구조체에 대한 포인터를 지정하면 거기에 담아서 반환해 준다.
'20년차 개발자' 카테고리의 다른 글
IPv6 관련한 잡다한 내용 (0) | 2019.10.31 |
---|---|
wireshark 에서 RTP와 SRTP의 구분 (IPv4, IPv6 혼용망) (0) | 2019.09.25 |
vim에 함수를 만들어 사용하자. (0) | 2019.08.05 |
localtime()을 localtime_r()로 바꿀 때 주의사항 (1) | 2019.05.20 |
리눅스 lsof 명령어 사용시 command 가 길어서 곤란할 때 (0) | 2019.03.20 |