Linux stat st mode

Linux stat st mode

The lstat ();
system call is like stat ();
except in the case where the named file is a symbolic link, in which case lstat ();
returns information about the link, while stat ();
returns information about the file the link references.

The fstat ();
system call obtains the same information about an open file known by the file descriptor Fa fd .

The Fa sb argument is a pointer to a Vt stat structure as defined by #include
and into which information is placed concerning the file.

The fields of Vt struct stat related to the file system are as follows:

st_dev The numeric ID of the device containing the file. st_ino The file’s inode number. st_nlink The number of hard links to the file.

The st_dev and st_ino fields together identify the file uniquely within the system.

The time-related fields of Vt struct stat are as follows:

st_atime Time when file data last accessed. Changed by the mknod(2), utimes(2), read(2) and readv(2) system calls. st_mtime Time when file data last modified. Changed by the mkdir(2), mkfifo(2), mknod(2), utimes(2), write(2) and writev(2) system calls. st_ctime Time when file status was last changed (inode data modification). Changed by the chflags(2), chmod(2), chown(2), creat(2), link(2), mkdir(2), mkfifo(2), mknod(2), rename(2), rmdir(2), symlink(2), truncate(2), unlink(2), utimes(2), write(2) and writev(2) system calls. st_birthtime Time when the inode was created.

If _POSIX_SOURCE is not defined, the time-related fields are defined as:

The size-related fields of the Vt struct stat are as follows:

st_size The file size in bytes. st_blksize The optimal I/O block size for the file. st_blocks The actual number of blocks allocated for the file in 512-byte units. As short symbolic links are stored in the inode, this number may be zero.

The access-related fields of Vt struct stat are as follows:

st_uid The user ID of the file’s owner. st_gid The group ID of the file. st_mode Status of the file (see below).

The status information word Fa st_mode has the following bits:

For a list of access modes, see In sys/stat.h , access(2) and chmod(2). The following macros are available to test whether a st_mode value passed in the Fa m argument corresponds to a file of the specified type:

Fn S_ISBLK m Test for a block special file. Fn S_ISCHR m Test for a character special file. Fn S_ISDIR m Test for a directory. Fn S_ISFIFO m Test for a pipe or FIFO special file. Fn S_ISLNK m Test for a symbolic link. Fn S_ISREG m Test for a regular file. Fn S_ISSOCK m Test for a socket. Fn S_ISWHT m Test for a whiteout.

The macros evaluate to a non-zero value if the test is true or to the value 0 if the test is false.

RETURN VALUES


COMPATIBILITY


ERRORS

Bq Er EACCES Search permission is denied for a component of the path prefix. Bq Er EFAULT The Fa sb or Fa path argument points to an invalid address. Bq Er EIO An I/O error occurred while reading from or writing to the file system. Bq Er ELOOP Too many symbolic links were encountered in translating the pathname. Bq Er ENAMETOOLONG A component of a pathname exceeded 255 characters, or an entire path name exceeded 1023 characters. Bq Er ENOENT The named file does not exist. Bq Er ENOTDIR A component of the path prefix is not a directory. Bq Er EOVERFLOW The file size in bytes cannot be represented correctly in the structure pointed to by Fa sb .

The fstat ();
system call will fail if: Bq Er EBADF The Fa fd argument is not a valid open file descriptor. Bq Er EFAULT The Fa sb argument points to an invalid address. Bq Er EIO An I/O error occurred while reading from or writing to the file system. Bq Er EOVERFLOW The file size in bytes cannot be represented correctly in the structure pointed to by Fa sb .

Источник

Linux stat st mode

The lstat ();
system call is like stat ();
except in the case where the named file is a symbolic link, in which case lstat ();
returns information about the link, while stat ();
returns information about the file the link references.

The fstat ();
system call obtains the same information about an open file known by the file descriptor Fa fd .

The Fa sb argument is a pointer to a Vt stat structure as defined by #include
and into which information is placed concerning the file.

The fields of Vt struct stat related to the file system are as follows:

st_dev The numeric ID of the device containing the file. st_ino The file’s inode number. st_nlink The number of hard links to the file.

The st_dev and st_ino fields together identify the file uniquely within the system.

The time-related fields of Vt struct stat are as follows:

st_atime Time when file data last accessed. Changed by the mknod(2), utimes(2), read(2) and readv(2) system calls. st_mtime Time when file data last modified. Changed by the mkdir(2), mkfifo(2), mknod(2), utimes(2), write(2) and writev(2) system calls. st_ctime Time when file status was last changed (inode data modification). Changed by the chflags(2), chmod(2), chown(2), creat(2), link(2), mkdir(2), mkfifo(2), mknod(2), rename(2), rmdir(2), symlink(2), truncate(2), unlink(2), utimes(2), write(2) and writev(2) system calls. st_birthtime Time when the inode was created.

If _POSIX_SOURCE is not defined, the time-related fields are defined as:

The size-related fields of the Vt struct stat are as follows:

st_size The file size in bytes. st_blksize The optimal I/O block size for the file. st_blocks The actual number of blocks allocated for the file in 512-byte units. As short symbolic links are stored in the inode, this number may be zero.

The access-related fields of Vt struct stat are as follows:

st_uid The user ID of the file’s owner. st_gid The group ID of the file. st_mode Status of the file (see below).

The status information word Fa st_mode has the following bits:

For a list of access modes, see In sys/stat.h , access(2) and chmod(2). The following macros are available to test whether a st_mode value passed in the Fa m argument corresponds to a file of the specified type:

Читайте также:  Microsoft windows essential security free

Fn S_ISBLK m Test for a block special file. Fn S_ISCHR m Test for a character special file. Fn S_ISDIR m Test for a directory. Fn S_ISFIFO m Test for a pipe or FIFO special file. Fn S_ISLNK m Test for a symbolic link. Fn S_ISREG m Test for a regular file. Fn S_ISSOCK m Test for a socket. Fn S_ISWHT m Test for a whiteout.

The macros evaluate to a non-zero value if the test is true or to the value 0 if the test is false.

RETURN VALUES


COMPATIBILITY


ERRORS

Bq Er EACCES Search permission is denied for a component of the path prefix. Bq Er EFAULT The Fa sb or Fa path argument points to an invalid address. Bq Er EIO An I/O error occurred while reading from or writing to the file system. Bq Er ELOOP Too many symbolic links were encountered in translating the pathname. Bq Er ENAMETOOLONG A component of a pathname exceeded 255 characters, or an entire path name exceeded 1023 characters. Bq Er ENOENT The named file does not exist. Bq Er ENOTDIR A component of the path prefix is not a directory. Bq Er EOVERFLOW The file size in bytes cannot be represented correctly in the structure pointed to by Fa sb .

The fstat ();
system call will fail if: Bq Er EBADF The Fa fd argument is not a valid open file descriptor. Bq Er EFAULT The Fa sb argument points to an invalid address. Bq Er EIO An I/O error occurred while reading from or writing to the file system. Bq Er EOVERFLOW The file size in bytes cannot be represented correctly in the structure pointed to by Fa sb .

Источник

Linux stat st mode

int stat(const char * file_name , struct stat * buf );
int fstat(int filedes , struct stat * buf );
int lstat(const char * file_name , struct stat * buf );

ОПИСАНИЕ

Эти функции возвращают информацию об указанном файле. Для этого не требуется иметь права доступа к файлу, хотя потребуются права поиска во всех каталогах, указанных в полном имени файла.

stat возвращает информацию о файле file_name и заполняет буфер buf . lstat идентична stat , но в случае символьных сылок она возвращает информацию о самой ссылке, а не о файле, на который она указывает. fstat идентична stat , только возвращается информация об открытом файле, на который указывает filedes (возвращаемый open (2)), а не о file_name .

Все эти функции возвращают структуру stat , которая содержит следующие поля:

Поле st_size задает размер файла (если он обычный или является символьной ссылкой) в байтах. Размер символьной ссылки — длина пути файла на который она сылается, без конечного NUL.

Поле st_blocks задает размер файла в 512-байтных блоках. (Оно может быть меньше, чем st_size /512 например, когда в файле есть пропуски.) st_blksize задает «предпочтительный» размер блока для эффективного ввода/вывода в файловой системе. (Запись в файл более мелкими порциями может привести к некорректному чтению/изменению/повторной записи информации).

Некоторые файловые системы Linux не реализуют все метки времени. Некоторые файловые системы позволяют обращаться к файлам так, что не происходит никаких изменений в поле st_atime . (См. ‘noatime’ в mount (8). Поле st_atime изменяется при доступе к файлу, например, при execve (2), mknod (2), pipe (2), utime (2) и read (2) (если прочитано больше нуля байтов). Другие функции, например, mmap (2), могут изменять, а могут и не изменять st_atime . Поле st_mtime изменяется при модификациях файла, например, при выполнении mknod (2), truncate (2), utime (2) и write (2) (если записано больше нуля байтов). Более того, поле st_mtime каталога изменяется при создании и удалении файлов в этом каталоге. Поле st_mtime не изменяется при изменении владельца, группы, количества жестких ссылок файла или режима доступа к нему. Поле st_ctime изменяется при записи или установке информации об inode (владельце, группе, количестве ссылок, режиме и т.д.).

Указанные далее макросы POSIX проверяют, является ли файл: S_ISLNK(m) символьной ссылкой (Нет в POSIX.1-1996.) S_ISREG(m) обычным файлом S_ISDIR(m) каталогом S_ISCHR(m) символьным устройством S_ISBLK(m) блочным устройством S_ISFIFO(m) каналом FIFO S_ISSOCK(m) сокетом

Описанные ниже флаги определены для поля st_mode :

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 бит принадлежности (смотри ниже)
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 все прочие имеют права выполнения
Бит setgid (S_ISGID) имеет несколько специальных применений: указывает, что для данного каталога используется семантика BSD; файлы, создаваемые в нем, наследуют группу-владельца от этого каталога, а не от фактической группы-владельца процесса, создавшего файл; а в подкаталогах данного каталога также будет установлен бит S_ISGID. Если файл не имеет бита выполнения группой (S_IXGRP), то бит setgid означает жесткую блокировку файла/записей. Бит принадлежности (S_ISVTX) каталога означает, что файлы в этом каталоге могут быть удалены или переименованы только владельцем файла, владельцем каталога и суперпользователем.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ


НАЙДЕННЫЕ ОШИБКИ


СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX не описывает биты S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX, но вместо этого требует использовать макросы S_ISDIR() и т.п. Макросов S_ISLNK и S_ISSOCK нет в стандарте POSIX.1-1996, но оба они могут быть в следующем стандарте POSIX; бывший SVID 4v2, последний SVIDv2. Unix V7 (и более поздние системы) имеют S_IREAD, S_IWRITE, S_IEXEC, тогда как POSIX требует присутствия синонимов S_IRUSR, S_IWUSR, S_IXUSR.

Источник

Linux stat st mode

fstat, lstat, fstatat

ОБЗОР

int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
#include /* определения констант AT_* */
#include
int fstatat(int dirfd, const char *pathname, struct stat *buf,
int flags);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

/* glibc 2.19 и старее */ _BSD_SOURCE ||
/* начиная с glibc 2.20 */_DEFAULT_SOURCE ||
_XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* начиная с glibc 2.10: */ _POSIX_C_SOURCE >= 200112L

Читайте также:  Atheros ar5b97 windows x64

Начиная с glibc 2.10: _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L До glibc 2.10: _ATFILE_SOURCE

ОПИСАНИЕ

Данные системные вызовы возвращают информацию о файле в буфер, на который указывает buf. Для этого не требуется иметь права доступа к самому файлу, но — в случае stat(), fstatat() и lstat() — потребуются права выполнения (поиска) на все каталоги, указанные в полном имени файла pathname.

Вызовы stat() и fstatat() возвращают информацию о файле, указанном в pathname; различия с fstatat() описаны далее.

Вызов lstat() идентичен stat(), но в случае, если pathname является символьной ссылкой, то возвращается информация о самой ссылке, а не о файле, на который она указывает.

Вызов fstat() идентичен stat(), но опрашиваемый файл задаётся в виде файлового дескриптора fd.

Все эти системные вызовы возвращают структуру stat, которая содержит следующие поля:

Замечание: порядок полей структуры stat для разных архитектур отличается. Также, в определении выше не показаны дополняющие байты, которые для различных архитектур могут присутствовать между некоторыми полями Если необходимы подробности, то посмотрите исходный код glibc и ядра.

Замечание: Для простоты и производительности различные поля структуры stat могут содержать информацию о состоянии из различных моментов работы системного вызова. Например, если st_mode или st_uid изменились другим процессом с помощью вызова chmod(2) или chown(2), то stat() может вернуть старое значение st_mode вместе с новым st_uid, или старое значение st_uid вместе с новым st_mode.

Поле st_dev описывает устройство, на котором расположен файл (для разбора идентификатора этого поля могут пригодиться макросы major(3) и minor(3)).

Поле st_rdev описывает устройство, который этот файл (inode) представляет.

В поле st_size хранится размер файла (если он обычный или является символьной ссылкой) в байтах. Размер символьной ссылки равен длине пути файла, на который она ссылается, без конечного нулевого байта.

В поле st_blocks хранится размер файла в 512-байтных блоках (размер может быть меньше, чем st_size/512, когда в файле есть пропуски (holes)).

В поле st_blksize хранится «предпочтительный» размер блока для эффективного ввода/вывода в файловой системе (запись в файл более мелкими порциями может привести к неэффективному чтению/изменению/повторной записи).

Не во всех файловых системах Linux используются все поля меток времени. Некоторые файловые системы можно смонтировать так, что факт доступа к файлу или каталогу не вызовет изменение поля st_atime (смотрите описание noatime, nodiratime и relatime в mount(8) и связанную с ними информацию в mount(2)). Кроме того, поле st_atime не обновляется, если файл открыт с флагом O_NOATIME; см. open(2).

Поле st_atime изменяется при доступе к файлу, например, при выполнении execve(2), mknod(2), pipe(2), utime(2) и read(2) (при чтении ненулевого количества байт). Другие процедуры, например mmap(2), могут изменять st_atime, но могут и не делать этого.

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

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

В POSIX относятся к битам st_mode равным маске S_IFMT (смотрите ниже) как к типу файла (file type), 12 битам, соответствующим маске 07777, как к битам режима файла (file mode bits) и наименее значащим 9 битам (0777) как к битам доступа к файлу (file permission bits).

Следующие значения масок определены для типа файла в поле st_mode:

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

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

Так как приведённое выше тестирование имеет общий вид, в 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.)

Таким образом, ранее показанный фрагмент кода можно переписать как:

Большинство определений показанных ранее макросов тестирования типа файла доступно, если определён любой из следующих макросов тестирования свойств: _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 или более.

Определение S_ISSOCK() доступно, если определён любой из следующих макросов тестирования свойств: _BSD_SOURCE (в glibc 2.19 и старее), _DEFAULT_SOURCE (в glibc 2.20 и новее), _XOPEN_SOURCE со значением 500 или более или _POSIX_C_SOURCE со значением 200112L или более.

Следующие значения масок определены для компонента режима доступа к файлу в поле 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) на каталоге означает, что файлы в этом каталоге могут быть удалены или переименованы только владельцем файла, владельцем каталога и привилегированным процессом.

fstatat()

Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в stat()).

Если в pathname задан относительный путь и значение dirfd равно AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как stat()).

Читайте также:  Почему не запускается самп windows 10

Если в pathname задан абсолютный путь, то dirfd игнорируется.

Значение flags может быть 0, или включать один или более следующих флагов:

AT_EMPTY_PATH (начиная с Linux 2.6.39) Если значение pathname равно пустой строке, то выполнять действие над файлом, на который указывает dirfd (который может быть получен с помощью open(2) с флагом O_PATH). Если dirfd равно AT_FDCWD, то вызов выполняет действие над текущим рабочим каталогом. В этом случае, dirfd может указывать на файл любого типа, а не только на каталог. Этот флаг есть только в Linux; для получения его определения определите _GNU_SOURCE. AT_NO_AUTOMOUNT (начиная с Linux 2.6.38) Не выполнять автоматическое монтирование конечного компонента («basename») pathname, если это каталог, который является точкой монтирования. Это позволяет вызывающему получить атрибуты точки монтирования (а не расположения, где её предполагалось смонтировать). Этот флаг можно использовать в инструментах, сканирующих каталоги, для предотвращения массового автоматического монтирования каталогов в их точки монтирования. Флаг AT_NO_AUTOMOUNT не учитывается, если к точке уже уже была выполнено монтирование. Этот флаг есть только Linux; для его получения нужно задать _GNU_SOURCE. AT_SYMLINK_NOFOLLOW Если значение pathname является символьной ссылкой, не разыменовывать её, а вернуть информацию о самой ссылке, как это делается в lstat(). (По умолчанию, fstatat() разыменовывает символьные ссылки как и stat().)

Смотрите в openat(2) объяснение необходимости fstatat().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

ОШИБКИ

В fstatat() дополнительно могут возникнуть следующие ошибки:

EBADF Значение dirfd не является правильным файловым дескриптором. EINVAL Указано неверное значение в flags. ENOTDIR Значение pathname содержит относительный путь и dirfd содержит файловый дескриптор, указывающий на файл, а не на каталог.

ВЕРСИИ

СООТВЕТСТВИЕ СТАНДАРТАМ

Согласно POSIX.1-2001, lstat() для символьной ссылки требует вернуть корректную информацию только в поле st_size и в типе файла в поле st_mode структуры stat. В POSIX.1-2008 более жёсткая спецификация, требующая, чтобы lstat() возвращал корректную информацию во всех полях кроме битов режима в st_mode.

Использование полей st_blocks и st_blksize может усложнить перенос на другие платформы (эти поля появились из BSD. В разных системах они трактуются по-разному и, вероятно, даже в одной системе при использовании NFS). Если вам нужно получить определение типа blkcnt_t или blksize_t из , то определите _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.

Другие системы

Значения, которые использовались (или используются) в различных системах:

шест. имя ls восм. описание
f000 S_IFMT 170000 маска типа файла
0000 000000 в SCO — недействующий inode; в BSD — неизвестный тип; в SVID-v2 и XPG2 — 0 и 0100000 означают обычный файл
1000 S_IFIFO p| 010000 FIFO (именованный канал)
2000 S_IFCHR c 020000 символьный специальный (V7)
3000 S_IFMPC 030000 мультиплексированный символьный
специальный (V7)
4000 S_IFDIR d/ 040000 каталог (V7)
5000 S_IFNAM 050000 в XENIX — именованный специальный файл с двумя подтипами, различающимися значениями st_rdev — 1, 2
0001 S_INSEM s 000001 подтип IFNAM семафора XENIX
0002 S_INSHD m 000002 подтип IFNAM общих данных XENIX
6000 S_IFBLK b 060000 блочный специальный (V7)
7000 S_IFMPB 070000 мультиплексированный блочный
специальный (V7)
8000 S_IFREG 100000 обычный (V7)
9000 S_IFCMP 110000 VxFS: сжатый
9000 S_IFNWK n 110000 сетевой специальный (HP-UX)
a000 S_IFLNK [email protected] 120000 символьная ссылка (BSD)
b000 S_IFSHAD 130000 в Solaris — теневой inode для ACL (не виден пользовательскими процессами)
c000 S_IFSOCK s= 140000 сокет (BSD; также «S_IFSOC» в VxFS)
d000 S_IFDOOR D> 150000 Solaris: дверь
e000 S_IFWHT w% 160000 BSD whiteout (не используется для inode)
0200 S_ISVTX 001000 закрепляющий бит: сохраняет код программы в файле подкачки даже после использования (V7)
зарезервировано (SVID-v2)
для не каталогов: не кэшировать этот файл (SunOS)
для каталогов: флаг ограниченного удаления (SVID-v4.2)
0400 S_ISGID 002000 set-group-ID при выполнении (V7)
для каталогов: использовать семантику BSD для распространения GID
0400 S_ENFMT 002000 жёсткая блокировка файлов в стиле System V (общий c S_ISGID)
0800 S_ISUID 004000 set-user-ID на выполнение (V7)
0800 S_CDF 004000 каталог является файлом, зависящим от контекста (HP-UX)

Закрепляющий бит появился в Version 32V AT&T UNIX.

ЗАМЕЧАНИЯ

Для большинства файлов в каталоге /proc вызов stat() не возвращает размер файла в поле st_size (значение этого поля равно 0).

Поля с отметками времени

Начиная с ядра 2.5.48, в структуре stat поддерживается наносекундная точность для всех трёх полей времени. Наносекундные компоненты каждого метки времени доступны под именами вида st_atim.tv_nsec, если определён макрос тестирования свойств _BSD_SOURCE или _SVID_SOURCE. Сейчас наносекундные метки времени стандартизованы, начиная с POSIX.1-2008, и, начиная с версии 2.12, в glibc также есть поддержка имён наносекундных компонент, если определён _POSIX_C_SOURCE со значением 200809L или более, или _XOPEN_SOURCE со значением 700 или более. Если ни один из вышеупомянутых макросов не определён, то наносекундные значения доступны под именами вида st_atimensec.

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

Отличия между библиотекой C и ядром

Внутренние ядерные структуры stat в разных версиях:

__old_kernel_stat Самая первая версия структуры со слегка узкими полями и без заполнителей. stat Увеличенное поле st_ino и добавлены заполнители в различные части структуры для расширения в дальнейшем. stat64 Ещё раз увеличенное поле st_ino, увеличены поля st_uid и st_gid для работы с увеличенными в Linux-2.4 UID и GID до 32 бит, увеличены другие поля, дальнейшее добавление заполнителей в структуру (различные байты заполнения в дальнейшем были задействованы в Linux 2.6 с появлением 32-битных ID устройств и наносекундной части в полях временных отметок).

Обёрточная функция glibc stat() прячет эти подробности от приложений, вызывая самую новую версию системного вызова, предоставляемого ядром, и перепаковывая возвращаемую информацию, если это нужно для старых программ.

В современных 64-битных системах жизнь упростилась: единственный системный вызов stat() и ядро работает со структурой stat, в которой поля достаточного размера.

Нижележащий системный вызов, используемый обёрточной функцией fstatat() в glibc, на самом деле называется fstatat64() или, на некоторых архитектурах, newfstatat().

Источник

Оцените статью