STATX(2) | Руководство программиста Linux | STATX(2) |
statx - считывает состояние файла (расширенный вариант)
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> /* константы AT_* */
int statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf);
Этот системный вызов возвращает информацию о файле, записывая её в буфер, на который указывает statxbuf. Возвращаемый буфер представляет собой структуру следующего вида:
struct statx { __u32 stx_mask; /* маска битов, показывающая заполненные поля */ __u32 stx_blksize; /* размер блока ввода-вывода файловой системы */ __u64 stx_attributes; /* индикаторы дополнительных файловых атрибутов */ __u32 stx_nlink; /* количество жёстких ссылок */ __u32 stx_uid; /* идентификатор пользователя-владельца */ __u32 stx_gid; /* идентификатор группы-владельца */ __u16 stx_mode; /* тип файла и режим доступа */ __u64 stx_ino; /* номер иноды */ __u64 stx_size; /* полный размер в байтах */ __u64 stx_blocks; /* количество выделенных 512-байтовых блоков */ __u64 stx_attributes_mask; /* маска, показывающая поддерживаемые атрибуты в stx_attributes */ /* поля меток времени */ struct statx_timestamp stx_atime; /* последний доступ */ struct statx_timestamp stx_btime; /* создание */ struct statx_timestamp stx_ctime; /* последнее изменение состояния */ struct statx_timestamp stx_mtime; /* последнее изменение */ /* если файл представляет устройство, то в следующих полях содержится идентификатор устройства */ __u32 stx_rdev_major; /* основной идентификатор */ __u32 stx_rdev_minor; /* дополнительный идентификатор */ /* поля идентификатора устройства с файловой системой, в которой содержится файл */ __u32 stx_dev_major; /* основной идентификатор */ __u32 stx_dev_minor; /* дополнительный идентификатор */ };
Метки времени файла хранятся в структуре следующего вида:
struct statx_timestamp { __s64 tv_sec; /* количество секунд с начала Эпохи (время UNIX) */ __u32 tv_nsec; /* количество наносекунд, начиная с tv_sec */ };
(зарезервированное пространство и заполнители не показаны)
Для получения состояния файла не требуется иметь права доступа к самому файлу, но в случае указания statx() с путём, потребуются права выполнения (поиска) во всех каталогах, указанных в полном имени файла pathname.
Вызов statx() для определения нужного файла использует pathname, dirfd и flags следующими путями:
Значение flags можно использовать для уточнения поиска на основе пути. Оно составляется из побитно слагаемых следующих констант:
Значение flags также может использоваться для контроля типа синхронизации, которое выполняет ядро при опросе файла на удалённой файловой системе. Оно составляется из побитно слагаемых следующих значений:
Аргумент mask в statx() используется для указания ядру какие поля поля нужны вызывающему. Значение mask представляет побитовую комбинацию (посредством OR) следующих констант:
STATX_TYPE | Требуется stx_mode & S_IFMT |
STATX_MODE | Требуется stx_mode & ~S_IFMT |
STATX_NLINK | Требуется stx_nlink |
STATX_UID | Требуется stx_uid |
STATX_GID | Требуется stx_gid |
STATX_ATIME | Требуется stx_atime |
STATX_MTIME | Требуется stx_mtime |
STATX_CTIME | Требуется stx_ctime |
STATX_INO | Требуется stx_ino |
STATX_SIZE | Требуется stx_size |
STATX_BLOCKS | Требуется stx_blocks |
STATX_BASIC_STATS | [всё вышеперечисленное] |
STATX_BTIME | Требуется stx_btime |
STATX_ALL | [все доступные в данный момент поля] |
Заметим, что ядро не не отклоняет значения в mask, отличные от вышеперечисленных. Вместо этого оно просто информирует вызывающего, какие значения поддерживаются ядром и файловой системой через поле statx.stx_mask. Поэтому не устанавливайте значение mask в UINT_MAX (все биты), так как один или более бит в будущем могут использоваться для указания расширения буфера.
Информация о состоянии целевого файла возвращается в структуре statx, на которую указывает statxbuf. Она содержит stx_mask, в котором описывается возвращённая информация. Значение stx_mask имеет тот же формат, что и аргумент mask, и установленные в нём бит показывают какие поля были заполнены.
Стоит упомянуть, что ядро может вернуть поля, которые не был запрошены и запрошенные поля могут быть не заполнены, в зависимости от поддержки в нижележащей файловой системе (поля, которым были присвоены значение, но которые не были запрошены, можно игнорировать). В этих случаях stx_mask будет не равно mask.
Если файловая система не поддерживает поле или если значение поле содержит непрезентабельное значение (например, файл экзотического типа), то битовая маска в stx_mask, соответствующая этому полю, будет очищена даже если пользователь запросил его, и в целях совместимости в качестве значения, если возможно, будет помещена пустышка (например, в некоторых случаях пустышки UID и GID могут задаваться при монтировании).
Файловая система также может заполнить поля, которые вызывающий не запрашивал, при условии, что их значения доступны и это ничего стоит. Если это выполняется, то будут установлены соответствующие биты в stx_mask.
Замечание: с целью производительности и простоты различные поля в структуре statx могут содержать информацию о состоянии из различных моментов выполнения системного вызова. Например, если изменяется stx_mode или stx_uid другим процессом посредством вызова chmod(2) или chown(2), то stat() может вернуть старое значение stx_mode вместе с новым stx_uid, или старое stx_uid вместе с новым stx_mode.
Помимо полей stx_mask (описанной выше) структура statx имеет следующие поля:
Дополнительную информацию об этих полях смотрите в inode(7).
В поле stx_attributes содержится набор флагов (объединённых через ИЛИ), которые отображают дополнительные атрибуты файла. Заметим, что для атрибута, не указанного как поддерживаемого в stx_attributes_mask, имеющееся здесь значение является не корректным. Биты stx_attributes_mask точно бит в бит соответствуют битам поля stx_attributes.
Флаги:
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
Вызов statx() был добавлен в Linux 4.11; поддержка в glibc доступна с версии 2.28.
Вызов statx() есть только в Linux.
ls(1), stat(1), access(2), chmod(2), chown(2), readlink(2), stat(2), utime(2), capabilities(7), inode(7), symlink(7)
2019-03-06 | Linux |