- Linux stat st mode
- RETURN VALUES
- COMPATIBILITY
- ERRORS
- Linux stat st mode
- RETURN VALUES
- COMPATIBILITY
- ERRORS
- Linux stat st mode
- ОПИСАНИЕ
- ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
- НАЙДЕННЫЕ ОШИБКИ
- СООТВЕТСТВИЕ СТАНДАРТАМ
- Linux stat st mode
- ОБЗОР
- ОПИСАНИЕ
- fstatat()
- ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
- ОШИБКИ
- ВЕРСИИ
- СООТВЕТСТВИЕ СТАНДАРТАМ
- Другие системы
- ЗАМЕЧАНИЯ
- Поля с отметками времени
- Отличия между библиотекой C и ядром
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:
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 | все прочие имеют права выполнения |
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
НАЙДЕННЫЕ ОШИБКИ
СООТВЕТСТВИЕ СТАНДАРТАМ
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
Начиная с 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()).
Если в 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().
Источник