2012-05-23 1 views
3

학습 C와 atime/mtime 속성 및 nsec 정밀도 값에 대해 stat()이 반환하는 변수 유형 및 크기를 시각적으로 비교하려고합니다. .C atime/mtime을 nsec 정밀도로 가져 오는 Linux 통계()

나는 파일에 stat()을 실행하고 반환 합계 구조의 mtime에와 mtime에 NSEC 값을 가져 그리고 난 다음 ... utimes()에 긴 이야기를 전달하려면 별도의 변수에이 값을 (저장할 해요!).
http://www.kernel.org/doc/man-pages/online/pages/man2/stat.2.html#NOTES에 따르면 다양한 OS/빌드 조건에 따라 st_mtim.tv_nsec 또는 에서 값을 얻을 수 있습니다. 실제 프로그램에서는 두 가지를 모두 확인하고 설정 한 값을 사용하거나 보통 초 정밀도로 대체합니다. st_mtime

반환되는 일반 타임 스탬프를 저장하기 위해 선언해야하는 변수 유형 및 크기 st_mtime?

st_mtim.tv_nsec 또는 st_mtimensec에서 nsec 값을 저장하기 위해 선언해야하는 변수 유형 및 크기는 무엇입니까?
시간의 전체 초 수를 포함하여 소수입니까? 또는 그들은 시간의 nsec 부분을 반환합니까?

내 시스템의 아키텍처에 따라 nsec의 다양한 변수 크기를 선언해야합니까?

마지막으로 printf()을 사용하여 이러한 변수를 출력하기 위해 필요한 변환 지정자는 무엇입니까?

건배 B

답변

4
  1. st_mtimetime_t이어야한다.
  2. POSIX <time.h>에 따르면 tv_nsec의 형식은 단지 long입니다.
  3. st_mtim.tv_nsec과 같은 필드는 나노초의 수를 반환합니다.
  4. long의 경우 l; time_t의 경우 AFAIK가 명확하게 정의되어 있지 않습니다.
+1

정말 훌륭합니다. 그렇다면 어떻게 stat()에서 nsec 값에 이식 가능한 방법으로 액세스 할 수 있습니까? 일부 플랫폼에서는 st_mtim.tv_nsec에서 제공하고 일부는 st_mtimensec에서 제공하고 일부 플랫폼/파일 시스템에서는 nsec 해상도를 전혀 제공하지 않습니다. – batfastad

+2

슬프게도, 당신은 쉽게 이식 가능한 나노초 타이밍에 접근 할 수있는 코드를 쉽게 작성할 수 없습니다. 즉각적으로 가까운 장래에 플랫폼에 맞는 방법으로 코딩해야합니다. 'time_t'가 64 비트 값인 플랫폼이 있습니다. 32 비트 값이있는 (많은) 다른 것들이 있습니다. 'time_t'와 같은 모든 POSIX 타입을위한 포맷 매크로를 제공했던 analogue (또는 POSIX extension of)''이 있다면 도움이 될 것입니다. 아직 존재하지 않는 AFAIK. –

1

st_mtim.tv_nsec은 항상 [0,999999999]입니다. 초를 tv_sec에서 가져와야합니다. 이론적으로 초를 1000000000 배로 늘려 64 비트 값으로 저장할 수는 있지만 몇 백 년이 지나면 오버 플로우됩니다.

+1

'time_t '가 32 비트이면 64 비트 값의 범위가'tv_sec'보다 넓습니다. 2^32 초 ~ 136 년, 2^64 nsec ~ 585 년. – Potatoswatter

관련 문제