.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" Parts Copyright (c) 1995 Nicolai Langfeldt (janl@ifi.uio.no), 1/1/95 .\" and Copyright (c) 2006, 2007, 2014 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified by Michael Haardt .\" Modified 1993-07-24 by Rik Faith .\" Modified 1995-05-18 by Todd Larason .\" Modified 1997-01-31 by Eric S. Raymond .\" Modified 1995-01-09 by Richard Kettlewell .\" Modified 1998-05-13 by Michael Haardt .\" Modified 1999-07-06 by aeb & Albert Cahalan .\" Modified 2000-01-07 by aeb .\" Modified 2004-06-23 by Michael Kerrisk .\" 2007-06-08 mtk: Added example program .\" 2007-07-05 mtk: Added details on underlying system call interfaces .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH stat 2 "3 мая 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ stat, fstat, lstat, fstatat \- считывает состояние файла .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint stat(const char *restrict \fP\fIpathname\fP\fB,\fP \fB struct stat *restrict \fP\fIstatbuf\fP\fB);\fP \fBint fstat(int \fP\fIfd\fP\fB, struct stat *\fP\fIstatbuf\fP\fB);\fP \fBint lstat(const char *restrict \fP\fIpathname\fP\fB,\fP \fB struct stat *restrict \fP\fIstatbuf\fP\fB);\fP .PP \fB#include \fP/* определения констант \fBAT_*\fP */ \fB#include \fP .PP \fBint fstatat(int \fP\fIdirfd\fP\fB, const char *restrict \fP\fIpathname\fP\fB,\fP \fB struct stat *restrict \fP\fIstatbuf\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBlstat\fP(): .nf .\" _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED /* Since glibc 2.20 */ _DEFAULT_SOURCE || _XOPEN_SOURCE >= 500 || /* Since glibc 2.10: */ _POSIX_C_SOURCE >= 200112L || /* glibc 2.19 and earlier */ _BSD_SOURCE .fi .PP \fBfstatat\fP(): .nf Начиная с glibc 2.10: _POSIX_C_SOURCE >= 200809L До glibc 2.10: _ATFILE_SOURCE .fi .SH ОПИСАНИЕ These functions return information about a file, in the buffer pointed to by \fIstatbuf\fP. No permissions are required on the file itself, but\[em]in the case of \fBstat\fP(), \fBfstatat\fP(), and \fBlstat\fP()\[em]execute (search) permission is required on all of the directories in \fIpathname\fP that lead to the file. .PP Вызовы \fBstat\fP() и \fBfstatat\fP() возвращают информацию о файле, указанном в \fIpathname\fP; различия с \fBfstatat\fP() описаны далее. .PP \fBlstat\fP() is identical to \fBstat\fP(), except that if \fIpathname\fP is a symbolic link, then it returns information about the link itself, not the file that the link refers to. .PP .\" Вызов \fBfstat\fP() идентичен \fBstat\fP(), но опрашиваемый файл задаётся в виде файлового дескриптора \fIfd\fP. .SS "Структура stat" All of these system calls return a \fIstat\fP structure (see \fBstat\fP(3type)). .PP .\" Background: inode attributes are modified with i_mutex held, but .\" read by stat() without taking the mutex. \fIЗамечание\fP: Для простоты и производительности различные поля структуры \fIstat\fP могут содержать информацию о состоянии из разных моментов работы системного вызова. Например, если \fIst_mode\fP или \fIst_uid\fP изменились другим процессом с помощью вызова \fBchmod\fP(2) или \fBchown\fP(2), то \fBstat\fP() может вернуть старое значение \fIst_mode\fP вместе с новым \fIst_uid\fP, или старое значение \fIst_uid\fP вместе с новым \fIst_mode\fP. .SS fstatat() Системный вызов \fBfstatat\fP() представляет собой обобщённый интерфейс доступа к файловой информации, и может выполнить работу за \fBstat\fP(), \fBlstat\fP() и \fBfstat\fP(). .PP Если в \fIpathname\fP задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор \fIdirfd\fP (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в \fBstat\fP() и \fBlstat\fP()). .PP Если в \fIpathname\fP задан относительный путь и значение \fIdirfd\fP равно \fBAT_FDCWD\fP, то \fIpathname\fP рассматривается относительно текущего рабочего каталога вызывающего процесса (как \fBstat\fP() и \fBlstat\fP()). .PP Если в \fIpathname\fP задан абсолютный путь, то \fIdirfd\fP игнорируется. .PP Значение \fIflags\fP может быть 0, или включать один или более следующих флагов: .TP \fBAT_EMPTY_PATH\fP (начиная с Linux 2.6.39) .\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d .\" Before glibc 2.16, defining _ATFILE_SOURCE sufficed Если значение \fIpathname\fP равно пустой строке, то выполнять действие над файлом, на который указывает \fIdirfd\fP (который может быть получен с помощью \fBopen\fP(2) с флагом \fBO_PATH\fP). В этом случае \fIdirfd\fP может указывать на файл любого типа, а не только на каталог и поведение \fBfstatat\fP() подобно \fBfstat\fP(). Если \fIdirfd\fP равно \fBAT_FDCWD\fP, то вызов выполняет действие над текущим рабочим каталогом. Этот флаг есть только в Linux; для получения его определения определите \fB_GNU_SOURCE\fP. .TP \fBAT_NO_AUTOMOUNT\fP (начиная с Linux 2.6.38) Don't automount the terminal ("basename") component of \fIpathname.\fP Since Linux 3.1 this flag is ignored. Since Linux 4.11 this flag is implied. .TP \fBAT_SYMLINK_NOFOLLOW\fP Если значение \fIpathname\fP является символьной ссылкой, не разыменовывать её, а вернуть информацию о самой ссылке, как это делается в \fBlstat\fP(). (По умолчанию, \fBfstatat\fP() разыменовывает символьные ссылки как и \fBstat\fP().) .PP Смотрите в \fBopenat\fP(2) объяснение необходимости \fBfstatat\fP(). .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On success, zero is returned. On error, \-1 is returned, and \fIerrno\fP is set to indicate the error. .SH ОШИБКИ .TP \fBEACCES\fP Запрещён поиск в одном из каталогов пути \fIpathname\fP (смотрите также \fBpath_resolution\fP(7)). .TP \fBEBADF\fP Значение \fIfd\fP не является правильным открытым файловым дескриптором. .TP \fBEBADF\fP (\fBfstatat\fP()) \fIpathname\fP is relative but \fIdirfd\fP is neither \fBAT_FDCWD\fP nor a valid file descriptor. .TP \fBEFAULT\fP Неправильный адрес. .TP \fBEINVAL\fP (\fBfstatat\fP()) Указано неверное значение в \fIflags\fP. .TP \fBELOOP\fP Во время определения пути встретилось слишком много символьных ссылок. .TP \fBENAMETOOLONG\fP Слишком длинное значение аргумента \fIpathname\fP. .TP \fBENOENT\fP Компонент пути \fIpathname\fP не существует или является повисшей символьной ссылкой. .TP \fBENOENT\fP Значение \fIpathname\fP равно пустой строке и в \fIflags\fP не указано значение \fBAT_EMPTY_PATH\fP. .TP \fBENOMEM\fP Не хватает памяти (например, памяти ядра). .TP \fBENOTDIR\fP Компонент в префиксе пути \fIpathname\fP не является каталогом. .TP \fBENOTDIR\fP (\fBfstatat\fP()) Значение \fIpathname\fP содержит относительный путь и \fIdirfd\fP содержит файловый дескриптор, указывающий на файл, а не на каталог. .TP \fBEOVERFLOW\fP Значение \fIpathname\fP или \fIfd\fP ссылаются на файл, чей размер, номер inode или количество блоков не может быть представлено с помощью типов \fIoff_t\fP, \fIino_t\fP или \fIblkcnt_t\fP, соответственно. Эта ошибка может возникнуть, если, например, приложение собрано на 32\-битной платформе без флага \fI\-D_FILE_OFFSET_BITS=64\fP при вызове \fBstat\fP() для файла, чей размер превышает \fI(1<<31)\-1\fP байт. .SH СТАНДАРТЫ POSIX.1\-2008. .SH ИСТОРИЯ .TP \fBstat\fP() .TQ \fBfstat\fP() .TQ \fBlstat\fP() .\" SVr4 documents additional .\" .BR fstat () .\" error conditions EINTR, ENOLINK, and EOVERFLOW. SVr4 .\" documents additional .\" .BR stat () .\" and .\" .BR lstat () .\" error conditions EINTR, EMULTIHOP, ENOLINK, and EOVERFLOW. SVr4, 4.3BSD, POSIX.1\-2001. .TP \fBfstatat\fP() POSIX.1\-2008. Linux 2.6.16, glibc 2.4. .PP Согласно POSIX.1\-2001, \fBlstat\fP() для символьной ссылки требует вернуть корректную информацию только в поле \fIst_size\fP и в типе файла в поле \fIst_mode\fP структуры \fIstat\fP. В POSIX.1\-2008 более жёсткая спецификация, требующая, чтобы \fBlstat\fP() возвращал корректную информацию во всех полях кроме битов режима в \fIst_mode\fP. .PP Использование полей \fIst_blocks\fP и \fIst_blksize\fP может усложнить перенос на другие платформы. (Эти поля появились из BSD. Их смысл различается в разных системах и, вероятно, даже в одной системе при использовании NFS). .SS "Отличия между библиотекой C и ядром" .\" See include/asm-i386/stat.h in the Linux 2.4 source code for the .\" various versions of the structure definitions В течении долгого времени увеличение размера структуры \fIstat\fP привело к появлению трёх новых версий \fBstat\fP(): \fIsys_stat\fP() (слот \fI__NR_oldstat\fP), \fIsys_newstat\fP() (слот \fI__NR_stat\fP) и \fIsys_stat64()\fP (слот \fI__NR_stat64\fP) на 32\-битных платформах, например, i386. Первые две версии уже существовали в Linux 1.0 (но под другими именами); последняя была добавлена в Linux 2.4. Подобное замечание применимо к \fBfstat\fP() и \fBlstat\fP(). .PP Внутренние ядерные структуры \fIstat\fP в разных версиях: .TP \fI__old_kernel_stat\fP Самая первая версия структуры со слегка узкими полями и без заполнителей. .TP \fIstat\fP Увеличенное поле \fIst_ino\fP и добавлены заполнители в различные части структуры для расширения в дальнейшем. .TP \fIstat64\fP Ещё раз увеличенное поле \fIst_ino\fP, увеличены поля \fIst_uid\fP и \fIst_gid\fP для работы с увеличенными в Linux\-2.4 UID и GID до 32 бит, увеличены другие поля, дальнейшее добавление заполнителей в структуру (различные байты заполнения в дальнейшем были задействованы в Linux 2.6 с появлением 32\-битных ID устройств и наносекундной части в полях временных отметок). .PP .\" .\" A note from Andries Brouwer, July 2007 .\" .\" > Is the story not rather more complicated for some calls like .\" > stat(2)? .\" .\" Yes and no, mostly no. See /usr/include/sys/stat.h . .\" .\" The idea is here not so much that syscalls change, but that .\" the definitions of struct stat and of the types dev_t and mode_t change. .\" This means that libc (even if it does not call the kernel .\" but only calls some internal function) must know what the .\" format of dev_t or of struct stat is. .\" The communication between the application and libc goes via .\" the include file that defines a _STAT_VER and .\" _MKNOD_VER describing the layout of the data that user space .\" uses. Each (almost each) occurrence of stat() is replaced by .\" an occurrence of xstat() where the first parameter of xstat() .\" is this version number _STAT_VER. .\" .\" Now, also the definitions used by the kernel change. .\" But glibc copes with this in the standard way, and the .\" struct stat as returned by the kernel is repacked into .\" the struct stat as expected by the application. .\" Thus, _STAT_VER and this setup cater for the application-libc .\" interface, rather than the libc-kernel interface. .\" .\" (Note that the details depend on gcc being used as c compiler.) Обёрточная функция glibc \fBstat\fP() прячет эти подробности от приложений, вызывая самую новую версию системного вызова, предоставляемого ядром, и перепаковывая возвращаемую информацию, если это нужно для старых программ. .PP В современных 64\-битных системах жизнь упростилась: единственный системный вызов \fBstat\fP() и ядро работает со структурой \fIstat\fP, в которой поля достаточного размера. .PP .\" strace(1) shows the name "newfstatat" on x86-64 Нижележащий системный вызов, используемый обёрточной функцией \fBfstatat\fP() в glibc, на самом деле называется \fBfstatat64\fP() или, на некоторых архитектурах, \fBnewfstatat\fP(). .SH ПРИМЕРЫ Следующая программа вызывает \fBlstat\fP() и показывает некоторые поля из полученной структуры \fIstat\fP. .PP .\" SRC BEGIN (stat.c) .EX #include #include #include #include #include #include \& int main(int argc, char *argv[]) { struct stat sb; \& if (argc != 2) { fprintf(stderr, "Usage: %s \en", argv[0]); exit(EXIT_FAILURE); } \& if (lstat(argv[1], &sb) == \-1) { perror("lstat"); exit(EXIT_FAILURE); } \& printf("ID of containing device: [%x,%x]\en", major(sb.st_dev), minor(sb.st_dev)); \& printf("File type: "); \& switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("block device\en"); break; case S_IFCHR: printf("character device\en"); break; case S_IFDIR: printf("directory\en"); break; case S_IFIFO: printf("FIFO/pipe\en"); break; case S_IFLNK: printf("symlink\en"); break; case S_IFREG: printf("regular file\en"); break; case S_IFSOCK: printf("socket\en"); break; default: printf("unknown?\en"); break; } \& printf("I\-node number: %ju\en", (uintmax_t) sb.st_ino); \& printf("Mode: %jo (octal)\en", (uintmax_t) sb.st_mode); \& printf("Link count: %ju\en", (uintmax_t) sb.st_nlink); printf("Ownership: UID=%ju GID=%ju\en", (uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid); \& printf("Preferred I/O block size: %jd bytes\en", (intmax_t) sb.st_blksize); printf("File size: %jd bytes\en", (intmax_t) sb.st_size); printf("Blocks allocated: %jd\en", (intmax_t) sb.st_blocks); \& printf("Last status change: %s", ctime(&sb.st_ctime)); printf("Last file access: %s", ctime(&sb.st_atime)); printf("Last file modification: %s", ctime(&sb.st_mtime)); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМ. ТАКЖЕ" \fBls\fP(1), \fBstat\fP(1), \fBaccess\fP(2), \fBchmod\fP(2), \fBchown\fP(2), \fBreadlink\fP(2), \fBstatx\fP(2), \fButime\fP(2), \fBstat\fP(3type), \fBcapabilities\fP(7), \fBinode\fP(7), \fBsymlink\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .