C Linux stat() получает atime/mtime с точностью до nsec

Изучая C, я пытаюсь получить визуальное сравнение типов и размеров переменных, возвращаемых stat() для атрибутов atime/mtime и для значений точности nsec.

Я запускаю stat() в файле и хочу получить значения mtime и mtime nsec из возвращенной структуры статистики, а затем сохранить эти значения в отдельных переменных (которые я затем хочу передать в utimes()... долгая история!).
Согласно http://www.kernel.org/doc/man-pages/online/pages/man2/stat.2.html#NOTES Я могу получить значение из st_mtim.tv_nsec или st_mtimensec в зависимости от различных условий ОС/сборки. В моей реальной программе я проверю оба варианта и использую то, что установлено, или просто вернусь к обычной второй точности st_mtime

Какой тип и размер переменной мне нужно объявить, чтобы сохранить обычную метку времени, возвращаемую st_mtime?

Какой тип и размер переменной мне нужно объявить для хранения значения nsec из st_mtim.tv_nsec или st_mtimensec?
Являются ли они десятичными, включая количество целых секунд времени? Или они просто возвращают nsec часть времени?

Нужно ли объявлять разные размеры переменных для nsecs в зависимости от архитектуры моей системы?

И, наконец, какие спецификаторы преобразования мне нужны для вывода этих переменных с помощью printf()?

Привет, Б


person batfastad    schedule 23.05.2012    source источник


Ответы (2)


  1. st_mtime должно быть time_t.
  2. Согласно POSIX <time.h> тип tv_nsec просто long.
  3. Такие поля, как st_mtim.tv_nsec, вернут количество наносекунд.
  4. Для long вам понадобится l; для time_t это четко не определено, насколько мне известно.
person Jonathan Leffler    schedule 23.05.2012
comment
Это блестяще. Итак, как я могу получить доступ к значению nsec из stat() портативным способом? Некоторые платформы предоставляют его в st_mtim.tv_nsec, а другие — в st_mtimensec, а некоторые платформы/файловые системы вообще не обеспечивают разрешение nsec. - person batfastad; 24.05.2012
comment
К сожалению, вы пока не можете легко запрограммировать переносимый доступ к наносекундным таймингам. В ближайшем обозримом будущем вам придется кодировать несколько специфичными для платформы способами. Обратите внимание, что существуют платформы, на которых time_t является 64-битным значением; есть (многие) другие, где это 32-битное значение. Было бы полезно, если бы существовал аналог (или расширение POSIX) <inttypes.h>, предоставляющий макросы формата для всех типов POSIX, таких как time_t. AFAIK, этого еще не существует. - person Jonathan Leffler; 24.05.2012

st_mtim.tv_nsec всегда находится в диапазоне [0,999999999]. Вам нужно получить секунды от tv_sec. Теоретически вы можете умножить секунды на 1000000000 и сохранить их вместе в 64-битном значении, но оно переполнится через пару сотен лет или около того.

person R.. GitHub STOP HELPING ICE    schedule 23.05.2012
comment
64-битное значение имеет больший диапазон, чем tv_sec, если time_t является 32-битным. 2^32 сек ~ 136 лет, 2^64 нс ~ 585 лет. - person Potatoswatter; 23.05.2012