INODE(7)

ИМЯ
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_atime; statx.stx_mtime

    Метка времени последнего изменения файла. Изменяется при изменении файла, например, при выполнении mknod(2), truncate(2), utime(2) и write(2) (если записано не менее одного байта). Кроме того, у каталога метка mtime изменяется при создании и удалении файлов в этом каталоге. Метка mtime не изменяется при изменении владельца, группы, количества жёстких ссылок или режима доступа.

Метка времени последнего изменения состояния (ctime)
    stat.st_ctime; statx.stx_ctime

    Метка времени последнего изменения состояния файла. Изменяется при записи или установке информации иноды (т. е., владельце, группе, количестве ссылок, режиме и т. д.).

Наносекундные метки времени поддерживаются в XFS, JFS, Btrfs и ext4 (начиная с Linux 2.6.23). Наносекундные метки времени не поддерживаются в ext2, ext3 и Reiserfs. В файловых системах, не поддерживающих метки времени короче секунды, в наносекундных полях структур stat и statx возвращается значение 0.

  Тип файла и режим
Поле stat.st_mode (в statx(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 | сокет
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
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 группы этого каталога, а не фактическую группу создающего процесса, а для подкаталогов данного каталога также будет установлен бит S_ISGID. Если файл не имеет бита выполнения группой (S_IXGRP), то бит set-group-ID означает обязательную (mandatory) блокировку файла/записей.

Закрепляющий (sticky) бит (S_ISVTX) на каталоге означает, что файлы в этом каталоге могут быть удалены или переименованы только владельцем файла, владельцем каталога и привилегированным процессом.

СООТВЕТСТВИЕ СТАНДАРТАМ
Если вам нужно получить определение типа blkcnt_t или blksize_t из <sys/stat.h>, то определите _XOPEN_SOURCE со значением 500 или больше (до включения каких-либо заголовочных файлов).

В POSIX.1-1990 не описаны константы S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, вместо них указано использовать макросы S_ISDIR() и т.п. Константы S_IF* определены в POSIX.1-2001 и новее.

Макросы S_ISLNK() и S_ISSOCK() не описаны в POSIX.1-1996, но есть в POSIX.1-2001; первый взят из SVID 4, последний из SUSv2.

В UNIX V7 (и более поздних системах) есть S_IREAD, S_IWRITE, S_IEXEC, для которых в POSIX есть синонимы S_IRUSR, S_IWUSR, S_IXUSR.

ЗАМЕЧАНИЯ
Для псевдо-файлов, автоматически генерируемых ядром, размер файла (stat.st_size; statx.stx_size) возвращается не точным. Например, для многих файлов каталога /proc возвращается значение 0, а для различных файлов из каталога /sys возвращается размер 4096 байт, даже когда содержимое файла меньше этого значения. Из таких файлов нужно просто считать все возможные байты (и добавлять '\0' в возвращаемый буфер, если он считается строкой). st_atimensec.

СМОТРИТЕ ТАКЖЕ
stat(1), stat(2), statx(2), symlink(7)