[질문] 시간함수 clock_gettime() 와 관련하여 tv_nsec 의 범위

ssallamo의 이미지

안녕하세요,

전문가님들의 조언을 얻고자 합니다.

시간 함수를 가지고 키값을 생성하는 함수가 있는데요, 기존에는 단순히

gettimeofday() 함수를 사용해서 밀리세컨 단위로 키값을 설정해도 충분히 중복되지 않고

쓸 수 있었습니다만, 동시 처리량이 많아지면서 키가 중복되어 버리는 현상이 발생했습니다.

기존 tv_sec 의 1,000,000 표현범위보다 더 정밀한

clock_gettime() 의 tv_nsec를 사용하려고 했습니다.

뒤져보니 1,000,000,000 까지의 정밀하다고 하더군요,,

테스트로 대충 만들어서 돌려보았습니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
main()
{
struct timespec sCurNanoTimeVal;
int rtn, i;
 
	for(i=0; i<1000 ; i++){
	rtn = clock_gettime(CLOCK_REALTIME, &sCurNanoTimeVal);
	printf("[i:%06d] %ld %ld\n", i, sCurNanoTimeVal.tv_sec, sCurNanoTimeVal.tv_nsec);
 
	rtn = clock_gettime(CLOCK_REALTIME, &sCurNanoTimeVal);
	printf("[i:%06d] %ld %ld \n--\n", i, sCurNanoTimeVal.tv_sec, sCurNanoTimeVal.tv_nsec);
	}
 
	return 0;
}

로 돌려보았습니다만
결과는
----------------------------

tv_sec tv_nsec
--
[i:000994] 1307087854 806747000
[i:000994] 1307087854 806748000
--
[i:000995] 1307087854 806749000
[i:000995] 1307087854 806750000
--
[i:000996] 1307087854 806750000
[i:000996] 1307087854 806751000
--
[i:000997] 1307087854 806752000
[i:000997] 1307087854 806753000
--
[i:000998] 1307087854 806754000
[i:000998] 1307087854 806755000
--
[i:000999] 1307087854 806756000
[i:000999] 1307087854 806757000
--
-------------------------------------------------

로 tv_nsec 가 6자리로 표현되고 뒤에 000로 처리되더군요..

6자리만 사용한다면 기존에 밀리세컨으로도 사용할 수 있습니다만, 제가 원하는건 더 정밀한 값이 필요합니다.

아무리 찾아도 현재 값에 계산을 넣지 않으면,

6자리 이상 표현하게 하는 방법을 못찾았습니다.

TIME의 전문가님들!! 프로그램의 전문가님의 조언이 필요해요 ㅜㅜ

부디.... 저에게 한줄기 희망을.......................

감사합니다..

ssallamo@naver.com

ddoman의 이미지

아무런 수정없이 컴파일해서 돌려보니깐, 잘되는데요?

...
...
 
[i:000991] 1307136518 705085553
[i:000991] 1307136518 705088067 
--
[i:000992] 1307136518 705091070
[i:000992] 1307136518 705093584 
--
[i:000993] 1307136518 705096588
[i:000993] 1307136518 705099102 
--
[i:000994] 1307136518 705102175
[i:000994] 1307136518 705104619 
--
[i:000995] 1307136518 705107623
[i:000995] 1307136518 705110137 
--
[i:000996] 1307136518 705113210
[i:000996] 1307136518 705115655 
--
[i:000997] 1307136518 705118658
[i:000997] 1307136518 705121172 
--
[i:000998] 1307136518 705124175
[i:000998] 1307136518 705126690 
--
[i:000999] 1307136518 705129693
[i:000999] 1307136518 705132207

커널의 real-time clock과 관련된 부분 옵션을 한번 체크해보시는게 어떨지..
[Device Drivers] -> [Real Time Clock]