Шрифт:
Время изменения индекса файла. Указывает время последнего изменения служебных данных файла, таких, как права доступа или владелец.
ЗАМЕЧАНИЕ. Поле
st_ctime
не является «временем создания»! В системе Linux или Unix нет такой вещи. Часть более ранней документации называла поле st_ctime
временем создания. Это была вводящая в заблуждение попытка упростить представление служебных данных файла Тип
time_t
, использованный для полей st_atime
, st_mtime
и st_ctime
, представляет дату и время. Эти относящиеся ко времени значения иногда называют временными метками (timestamps). Обсуждение того, как использовать значение time_t
, отложено до раздела 6.1 «Время и даты». Подобным же образом типы uid_t
и gid_t
представляют номера владельца и группы, которые обсуждаются в разделе 6.3 «Имена пользователя и группы». Большинство других типов не представляют широкого интереса. 5.4.3. Только Linux: указание файлового времени повышенной точности
Ядра Linux 2.6 и более поздние предоставляют в
struct stat
три дополнительных поля. Они предусматривают точность файлового времени до наносекунд: st_atime_nsec
Наносекундная компонента времени доступа к файлу. st_mtime_nsec
Наносекундная компонента времени изменения файла st_ctime_nsec
Наносекундная компонента времени изменения служебных данных файла. Некоторые другие системы также предоставляют такие поля с повышенной точностью времени, но имена соответствующих членов структуры
struct stat
не стандартизованы, что затрудняет написание переносимого кода, использующего эти времена. (Связанные с этим расширенные системные вызовы см. в разделе 14.3.2 «Файловое время в микросекундах: utimes
».) 5.4.4. Определение типа файла
Вспомните, что в поле
st_mode
закодированы как тип файла, так и права доступа к нему. <sys/stat.h>
определяет ряд макросов, которые определяют тип файла. В частности, эти макросы возвращают true
или false
при использовании с полем st_mode
. У каждого описанного ранее типа файла есть свой макрос. Предположим, выполняется следующий код:
struct stat stbuf;
char filename[PATH_МАХ]; /* PATH_MAX из <limits.h> */
/* ... поместить имя файла в filename ... */
if (stat(filename, &stbuf) < 0) {
/* обработать ошибку */
}
Когда система заполнила
stbuf
, можно вызывать следующие макросы, причем в качестве аргумента передается stbuf.st_mode
:
S_ISREG(stbuf.st_mode)
Возвращает
true
, если filename
является обычным файлом.
S_ISDIR(stbuf.st_mode)
Возвращает
true
, если filename
является каталогом.
S_ISCHR(stbuf.st_mode)
Возвращает
true
, если filename
является символьным устройством. Устройства вскоре будут обсуждены более подробно.
S_ISBLK(stbuf.st_mode)
Возвращает
true
, если filename
является блочным устройством.
S_ISFIFO(stbuf.st_mode)
Возвращает
true
, если filename
является FIFO.
S_ISLNK(stbuf.st_mode)
Возвращает
true
, если filename
является символической ссылкой. (Это может никогда не вернуть true
, если вместо lstat
использовались stat
или fstat
.)
S_ISSOCK(stbuf.st_mode)
Возвращает
true
, если filename
является сокетом. ЗАМЕЧАНИЕ. В GNU/Linux эти макросы возвращают 1 для
true
и 0 для false
. Однако, на других системах возможно, что они будут возвращать для true
вместо 1 произвольное неотрицательное число. (POSIX определяет лишь ненулевое значение в противоположность нулевому). Поэтому всегда следует использовать эти макросы как автономные тесты вместо проверки возвращаемого значения.
/* Корректное использование */
if (S_ISREG(stbuf.st_mode)) ...
/* Heкорректное использование */
if (S_ISREG(stbuf.st_mode) ==1) ...
Наряду с макросами
<sys/stat.h>
предоставляет два набора битовых масок. Один набор для проверки прав доступа, а другой - для проверки типа файла. Мы видели маски прав доступа в разделе 4.6 «Создание файлов», когда обсуждали тип mode_t
и значения для open
и creat
. Битовые маски, их числовые значения для GNU/Linux и смысл приведены в табл. 5.2. Таблица 5.2. Битовые маски POSIX для типов файлов и прав доступа в
<sys/stat.h>