Тип
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>
| Маска | Значение | Комментарий |
S_IFMT
| 0170000 | Маска для битовых полей типа файла |
S_IFSOCK
| 0140000 | Сокет. |
S_IFLNK
| 0120000 | Символическая ссылка |
S_IFREG
| 0100000 | Обычный файл. |
S_IFBLK
| 0060000 | Блочное устройство. |
S_IFDIR
| 0040000 | Каталог. |
S_IFCHR
| 0020000 | Символьное устройство. |
S_IFIFO
| 0010000 | FIFO. |
S_ISUID
| 0004000 | Бит setuid. |
S_ISGID
| 0002000 | Бит setgid |
S_ISVTX
| 0001000 | «Липкий» (sticky) бит. |
S_IRWXU
| 0000700 | Маска для прав доступа владельца. |
S_IRUSR
| 0000400 | Доступ на чтение для владельца. |
S_IWUSR
| 0000200 | Доступ на запись для владельца. |
S_IXUSR
| 0000100 | Доступ на исполнение для владельца. |
S_IRWXG
| 0000070 | Маска для прав доступа группы. |
S_IRGRP
| 0000040 | Доступ на чтение для группы. |
S_IWGRP
| 0000020 | Доступ на запись для группы. |
S_IXGRP
| 0000010 | Доступ на исполнение для группы. |
S_IRWXO
| 0000007 | Маска для прав доступа остальных. |
S_IROTH
| 0000004 | Доступ на чтение для остальных. |
S_IWOTH
| 0000002 | Доступ на запись для остальных. |
S_IXOTH
| 0000001 | Доступ на исполнение для остальных. |