ИМЯ

inode - описание файловой иноды

ОПИСАНИЕ

Для каждого файла существует инода (inode), содержащая метаданные файла. Приложение может получить эти метаданные с помощью stat(2) (и подобных вызовов), который возвращает структуру stat, и statx(2), который возвращает структуру statx.
В следующем списке показана информация, которую, обычно, можно найти или которая относится к файловой иноде в полях соответствующей структуры, возвращаемой stat(2) и statx(2):
Устройство, на котором находится инода
stat.st_dev; statx.stx_dev_minor и statx.stx_dev_major
Каждая инода (а также связанный с ней файл) располагается в файловой системе, которая находится на устройстве. Это устройство опознаётся по комбинации своих основного (определяет общий класс устройства) и вспомогательного (определяет конкретный экземпляр в общем классе) идентификаторов.
Номер иноды
stat.st_ino; statx.stx_ino
Каждый файл в файловой системе имеет уникальный номер иноды. Для номеров инод гарантируется уникальность только внутри файловой системы (т. е., одинаковые номера инод могут использоваться в разных файловых системах, из-за чего жёсткие ссылки не могут пересекать границы файловой системы). В этом поле содержится номер иноды файла.
Тип файла и режим
stat.st_mode; statx.stx_mode
Описание типа файла и режим приведены ниже.
Счётчик ссылок
stat.st_nlink; statx.stx_nlink
Это поле содержит количество жёстких ссылок на файл. Дополнительные ссылки на существующий файл созданы с помощью link(2).
Пользовательский идентификатор
st_uid stat.st_uid; statx.stx_uid
В этом поле содержится идентификатор пользователя, которому принадлежит файл. При создании файла идентификатору пользователя файла присваивается идентификатор эффективного пользователя создающего процесса. Идентификатор пользователя файла можно изменить с помощью chown(2).
Идентификатор группы
stat.st_gid; statx.stx_gid
В этом поле содержится идентификатор группы, которой принадлежит файл. При создании файла идентификатору группы файла присваивается идентификатор группы родительского каталога или идентификатор эффективной группы создающего процесса, в зависимости от наличия бита set-group-ID на родительском каталоге (смотрите ниже). Идентификатор группы файла можно изменить с помощью chown(2).
Устройство, представляемое этой инодой
stat.st_rdev; statx.stx_rdev_minor и statx.stx_rdev_major
Если этот файл (инода) представляет устройство, то инода хранит основной и вспомогательный идентификатор этого устройства.
Размер файла
stat.st_size; statx.stx_size
Размер файла (если он обычный или является символьной ссылкой) в байтах. Размер символьной ссылки равен длине пути файла, на который она ссылается, без конечного нулевого байта.
Предпочтительный размер блока для ввода/вывода
stat.st_blksize; statx.stx_blksize
«Предпочтительный» размер блока для эффективного ввода/вывода в файловой системе (запись в файл более мелкими порциями может привести к неэффективному чтению/изменению/повторной записи).
Количество блоков, выделенных файлу
stat.st_blocks; statx.stx_size
Количество блоков (по 512 байт), выделенных для файла (может быть меньше, чем st_size/512, когда в файле есть пропуски (holes)).
В стандарте POSIX.1 отмечено, что размер единиц значения st_blocks структуры stat стандартом не определяется. Во многих реализациях он равен 512 байт; в некоторых системах используются другой — 1024. Кроме этого, размер единиц может отличаться для разных файловых систем.
Метка времени последнего доступа (atime)
stat.st_atime; statx.stx_atime
Метка времени последнего доступ к файлу. Изменяется при доступе к файлу, например, при выполнении execve(2), mknod(2), pipe(2), utime(2) и read(2) (при чтении ненулевого количества байт). Другие интерфейсы, например mmap(2), могут изменять метку, но могут и не делать этого.
Некоторые типы файловых систем позволяют выполнить монтирование таким образом, что факт доступа к файлу или каталогу не вызовет изменение метки atime (смотрите описание noatime, nodiratime и relatime в mount(8) и связанную с ними информацию в mount(2)). Также, поле метка atime не обновляется, если файл открыт с флагом O_NOATIME; смотрите open(2).
Метка времени создания файла (btime)
(не возвращается в структуре stat); statx.stx_btime
Метка времени создания файла. Устанавливается при создании файла и после этого не изменяется.
Метка btime отсутствовала в системах UNIX и в настоящее время не поддерживается в большинстве файловых систем Linux.
Метка времени последнего изменения (mtime)
stat.st_mtime; statx.stx_mtime
Метка времени последнего изменения файла. Изменяется при изменении файла, например, при выполнении mknod(2), truncate(2), utime(2) и write(2) (если записано не менее одного байта). Кроме того, у каталога метка mtime изменяется при создании и удалении файлов в этом каталоге. Метка mtime не изменяется при изменении владельца, группы, количества жёстких ссылок или режима доступа.
Метка времени последнего изменения состояния (ctime)
stat.st_ctime; statx.stx_ctime
Метка времени последнего изменения состояния файла. Изменяется при записи или установке информации иноды (т. е., владельце, группе, количестве ссылок, режиме и т. д.).
The timestamp fields report time measured with a zero point at the Epoch, 1970-01-01 00:00:00 +0000, UTC (see time(7)).
Метки времени наносекундной точности поддерживаются в XFS, JFS, Btrfs и ext4 (начиная с Linux 2.6.23). Метки времени наносекундной точности не поддерживаются в ext2, ext3 и Reiserfs. Для возвращать метки времени наносекундной точности поля меток времени в структурах stat и statx определены как структуры, включающие наносекундную составляющую. Подробности приведены в stat(2) и statx(2). Для файловых систем, не поддерживающих субсекундные метки времени, наносекундные поля в возвращаемых структурах stat и statx имеют значение 0.

Тип файла и режим

Поле stat.st_modestatx(2) — поле statx.stx_mode ) содержит тип файл и режим.
В POSIX относятся к битам stat.st_mode равным маске S_IFMT (смотрите ниже) как к типу файла (file type), 12 битам, соответствующим маске 07777, как к битам режима файла (file mode bits) и наименее значащим 9 битам (0777) как к битам доступа к файлу (file permission bits).
Следующие значения масок определены для типа файла:
S_IFMT 0170000 битовая маска битового поля для типа файла
S_IFSOCK 0140000 socket
S_IFLNK 0120000 символьная ссылка
S_IFREG 0100000 обычный файл
S_IFBLK 0060000 блочное устройство
S_IFDIR 0040000 каталог
S_IFCHR 0020000 символьное устройство
S_IFIFO 0010000 FIFO

Таким образом, чтобы проверить обычный файл (например) на возможность записи:

stat(pathname, &sb);
if ((sb.st_mode & S_IFMT) == S_IFREG) {
    /* обработка обычного файла */
}

Так как приведённое выше тестирование имеет общий вид, в POSIX определены дополнительные макросы, которые позволяют тестировать тип файла в st_mode более краткой записью:
S_ISREG(m)
обычный файл?
S_ISDIR(m)
каталог?
S_ISCHR(m)
символьное устройство?
S_ISBLK(m)
блочное устройство?
S_ISFIFO(m)
FIFO (именованный канал)?
S_ISLNK(m)
символьная ссылка? (нет в POSIX.1-1996.)
S_ISSOCK(m)
сокет? (нет в POSIX.1-1996.)
The preceding code snippet could thus be rewritten as:

stat(pathname, &sb);
if (S_ISREG(sb.st_mode)) {
    /* обработка обычного файла */
}

Определений большинства показанных ранее макросов тестирования типа файла доступно, если определён любой из следующих макросов тестирования свойств: _BSD_SOURCE (в glibc 2.19 и старее), _SVID_SOURCE (в glibc 2.19 и старее) или _DEFAULT_SOURCE (в glibc 2.20 и новее). Также, определение всех макросов, за исключением S_IFSOCK и S_ISSOCK(), доступны при наличии _XOPEN_SOURCE.
Определение S_IFSOCK также можно получить определив _XOPEN_SOURCE со значением 500 или более или (начиная с glibc 2.24) определением _XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED одновременно.
Определение S_ISSOCK() доступно, если определён любой из следующих макросов тестирования свойств: _BSD_SOURCE (в glibc 2.19 и старее), _DEFAULT_SOURCE (в glibc 2.20 и новее), _XOPEN_SOURCE со значением 500 или более или _POSIX_C_SOURCE со значением 200112L или более или (начиная с glibc 2.24) _XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED одновременно.
Следующие значения масок определены для компонента режима доступа к файлу в поле st_mode:
S_ISUID 04000 бит set-user-ID (смотрите execve(2))
S_ISGID 02000 бит set-group-ID (смотрите далее)
S_ISVTX 01000 закрепляющий бит (смотрите далее)
S_IRWXU 00700 владелец имеет права на чтение, запись и выполнение
S_IRUSR 00400 владелец имеет право на чтение
S_IWUSR 00200 владелец имеет право на запись
S_IXUSR 00100 владелец имеет право на выполнение
S_IRWXG 00070 группа имеет права на чтение, запись и выполнение
S_IRGRP 00040 имеет право на чтение
S_IWGRP 00020 группа имеет право на запись
S_IXGRP 00010 группа имеет право на выполнение
S_IRWXO 00007 все остальные (вне группы) имеют права на чтение, запись и выполнение
S_IROTH 00004 все остальные имеют право на чтение
S_IWOTH 00002 все остальные имеют право на запись
S_IXOTH 00001 все остальные имеют право на выполнение

Бит set-group-ID ( S_ISGID) имеет несколько специальных применений. Для каталога он указывает, что используется семантика BSD: файлы, создаваемые в каталоге, наследуют ID группы этого каталога, а не фактический ID группы создающего процесса, а для подкаталогов данного каталога также будет установлен бит S_ISGID. Для исполняемого файла бит set-group-ID заставляет изменить фактический ID группы процесса, который выполняет файл, согласно правилам, описанным в execve(2). Если файл не имеет бита выполнения группой ( S_IXGRP), то бит set-group-ID означает обязательную (mandatory) блокировку файла/записей.
Закрепляющий (sticky) бит ( S_ISVTX) на каталоге означает, что файлы в этом каталоге могут быть удалены или переименованы только владельцем файла, владельцем каталога и привилегированным процессом.

СТАНДАРТЫ

Если вам нужно получить определение типа blkcnt_t или blksize_t из <sys/stat.h>, то определите _XOPEN_SOURCE со значением 500 или больше (до включения каких-либо заголовочных файлов).
POSIX.1-1990 did not describe the S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, and S_ISVTX constants, but instead specified the use of the macros S_ISDIR() and so on. The S_IF* constants are present in POSIX.1-2001 and later.
Макросы S_ISLNK() и S_ISSOCK() не описаны в POSIX.1-1996, но есть в POSIX.1-2001; первый взят из SVID 4, последний из SUSv2.
UNIX V7 (and later systems) had S_IREAD, S_IWRITE, S_IEXEC, and where POSIX prescribes the synonyms S_IRUSR, S_IWUSR, and S_IXUSR.

ЗАМЕЧАНИЯ

For pseudofiles that are autogenerated by the kernel, the file size ( stat.st_size; statx.stx_size) reported by the kernel is not accurate. For example, the value 0 is returned for many files under the /proc directory, while various files under /sys report a size of 4096 bytes, even though the file content is smaller. For such files, one should simply try to read as many bytes as possible (and append '\0' to the returned buffer if it is to be interpreted as a string).

СМ. ТАКЖЕ

stat(1), stat(2), statx(2), symlink(7)

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]