C stat структура не имеет поля st_ctime, но только st_ctim - PullRequest
4 голосов
/ 06 декабря 2011

Я сейчас гуглю это около двух часов, но не смог найти ответы, которые помогли.

Определение 'stat', как указано в man-странице, говорит о том, что поле st_ctime существует.

       struct stat {
           dev_t     st_dev;     /* ID of device containing file */
           ino_t     st_ino;     /* inode number */
           mode_t    st_mode;    /* protection */
           nlink_t   st_nlink;   /* number of hard links */
           uid_t     st_uid;     /* user ID of owner */
           gid_t     st_gid;     /* group ID of owner */
           dev_t     st_rdev;    /* device ID (if special file) */
           off_t     st_size;    /* total size, in bytes */
           blksize_t st_blksize; /* blocksize for file system I/O */
           blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
           time_t    st_atime;   /* time of last access */
           time_t    st_mtime;   /* time of last modification */
           time_t    st_ctime;   /* time of last status change */
       };

Однако, похоже, что это не так для моей системы, хотя я использую gcc (который должен вести себя в соответствии со стандартом).

Фактически, все временные поля (atime, mtime, ctime) отсутствуют, и поэтому структура содержит некоторые значения atim, mtim и ctim, которые возвращают timepec вместо желаемого значения time_t.

Теперь мои вопросы:

  1. Почему это так? Может быть, я включил неправильный заголовок, но я действительно уверен, что это должен быть sys / stat.h.
  2. Я не нашел слишком много информации о timepec, что это такое и почему он возвращается сюда?
  3. Даже если я найду обходной путь, это поможет мне или какая-либо другая система не сможет выполнить мой код?

Я использую Ubuntu 11.10 и gcc 4.6.1.

Мой код (частично):

struct stat file_info;
    time_t t;

    if( lstat( path, &file_info ) == 0 ) {

        struct tm* timeinfo;
        t = file_info.st_ctime;
        timeinfo = localtime( &t );

Я был бы очень рад, если бы вы могли помочь с этим, я действительно понятия не имел, почему я не могу скомпилировать, используя поле st_ctime моей структуры, и, как обычно, gcc не слишком помогает при разговоре. об ошибках; -)

Возможно, нужно что-то делать с проблемами #include, но я не могу определить что.

Ответы [ 2 ]

2 голосов
/ 06 декабря 2011

POSIX 2008 требует, чтобы stat () возвращала struct timepec, чтобы дробная часть метки времени была доступна для уточненной точности меток времени - разрешение в одну секунду недостаточно для времени файла.

ДОБАВЛЕНО:

Из справочная страница

Начиная с ядра 2.5.48, структура stat поддерживает наносекундное разрешение для трех полей временных меток файла. Glibc предоставляет доступ к наносекундному компоненту каждого поля, используя имена в форме st_atim.tv_nsec, если определен макрос функционального теста _BSD_SOURCE или _SVID_SOURCE. Эти поля указаны в POSIX.1-2008, и, начиная с версии 2.12, glibc также предоставляет имена этих полей, если _POSIX_C_SOURCE определено со значением 200809L или больше, или _XOPEN_SOURCE определено со значением 700 или больше. Если ни один из вышеупомянутых макросов не определен, то наносекундные значения отображаются с именами вида st_atimensec. В файловых системах, которые не поддерживают субсекундные метки времени, наносекундные поля возвращаются со значением 0.

0 голосов
/ 06 декабря 2011

В моей документации (man lstat) указаны заголовки для включения и требования к макросу тестирования возможностей , которые необходимо определить перед заголовками

#define _POSIX_C_SOURCE 200112L
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

/* use stat, fstat, or lstat */
...