INODE(7) | Руководство программиста Linux | INODE(7) |
inode - описание файловой иноды
Для каждого файла существует инода (inode), содержащая метаданные файла. Приложение может получить эти метаданные с помощью stat(2) (и подобных вызовов), который возвращает структуру stat, и statx(2), который возвращает структуру statx.
В следующем списке показана информация, которую, обычно, можно найти или которая относится к файловой иноде в полях соответствующей структуры, возвращаемой stat(2) и statx(2):
За начальное значение полей меток времени принимается Эпоха, 1970-01-02 00:00:00 +0000, UTC (смотрите time(7)).
Метки времени наносекундной точности поддерживаются в XFS, JFS, Btrfs и ext4 (начиная с Linux 2.6.23). Метки времени наносекундной точности не поддерживаются в ext2, ext3 и Reiserfs. Для возвращать метки времени наносекундной точности поля меток времени в структурах stat и statx определены как структуры, включающие наносекундную составляющую. Подробности приведены в stat(2) и statx(2). Для файловых систем, не поддерживающих субсекундные метки времени, наносекундные поля в возвращаемых структурах 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 более краткой записью:
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 не описаны константы 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.
Для псевдо-файлов, автоматически генерируемых ядром, размер файла (statst_size; statx.stx_size) возвращается не точным. Например, для многих файлов каталога /proc возвращается значение 0, а для различных файлов из каталога /sys возвращается размер 4096 байт, даже когда содержимое файла меньше этого значения. Из таких файлов нужно просто считать все возможные байты (и добавлять '\0' в возвращаемый буфер, если он считается строкой).
2017-09-15 | Linux |