Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       stat, fstat, lstat, fstatat - считывает состояние файла

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <sys/stat.h>

       int stat(const char *restrict pathname,
                struct stat *restrict statbuf);
       int fstat(int fd, struct stat *statbuf);
       int lstat(const char *restrict pathname,
                struct stat *restrict statbuf);

       #include <fcntl.h>           /* определения констант AT_* */
       #include <sys/stat.h>

       int fstatat(int dirfd, const char *restrict pathname,
                struct stat *restrict statbuf, int flags);

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

       lstat():
           /* Since glibc 2.20 */ _DEFAULT_SOURCE
               || _XOPEN_SOURCE >= 500
               || /* Since glibc 2.10: */ _POSIX_C_SOURCE >= 200112L
               || /* glibc 2.19 and earlier */ _BSD_SOURCE

       fstatat():
           Начиная с glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           До glibc 2.10:
               _ATFILE_SOURCE

ОПИСАНИЕ

       These  functions return information about a file, in the buffer pointed to by statbuf.  No
       permissions are required on the file itself, but—in the case  of  stat(),  fstatat(),  and
       lstat()—execute (search) permission is required on all of the directories in pathname that
       lead to the file.

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

       lstat()   is  identical  to  stat(),  except  that if pathname is a symbolic link, then it
       returns information about the link itself, not the file that the link refers to.

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

   Структура stat
       All of these system calls return a stat structure (see stat(3type)).

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

   fstatat()
       Системный  вызов  fstatat()  представляет  собой  обобщённый  интерфейс доступа к файловой
       информации, и может выполнить работу за stat(), lstat() и fstat().

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

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

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

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

       AT_EMPTY_PATH (начиная с Linux 2.6.39)
              Если значение pathname равно пустой строке, то выполнять действие  над  файлом,  на
              который  указывает  dirfd  (который  может  быть получен с помощью open(2) с флагом
              O_PATH). В этом случае dirfd может указывать на файл любого типа, а  не  только  на
              каталог  и поведение fstatat() подобно fstat(). Если dirfd равно AT_FDCWD, то вызов
              выполняет действие над текущим рабочим каталогом. Этот флаг есть  только  в  Linux;
              для получения его определения определите _GNU_SOURCE.

       AT_NO_AUTOMOUNT (начиная с Linux 2.6.38)
              Don't  automount  the  terminal ("basename") component of pathname. Since Linux 3.1
              this flag is ignored.  Since Linux 4.11 this flag is implied.

       AT_SYMLINK_NOFOLLOW
              Если значение pathname является символьной ссылкой, не разыменовывать её, а вернуть
              информацию  о  самой  ссылке,  как это делается в lstat(). (По умолчанию, fstatat()
              разыменовывает символьные ссылки как и stat().)

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

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

       On success, zero is returned.  On error, -1 is returned, and errno is set to indicate  the
       error.

ОШИБКИ

       EACCES Запрещён   поиск   в   одном   из   каталогов   пути   pathname   (смотрите   также
              path_resolution(7)).

       EBADF  Значение fd не является правильным открытым файловым дескриптором.

       EBADF  (fstatat())  pathname is relative but dirfd is neither AT_FDCWD nor  a  valid  file
              descriptor.

       EFAULT Неправильный адрес.

       EINVAL (fstatat())  Указано неверное значение в flags.

       ELOOP  Во время определения пути встретилось слишком много символьных ссылок.

       ENAMETOOLONG
              Слишком длинное значение аргумента pathname.

       ENOENT Компонент пути pathname не существует или является повисшей символьной ссылкой.

       ENOENT Значение pathname равно пустой строке и в flags не указано значение AT_EMPTY_PATH.

       ENOMEM Не хватает памяти (например, памяти ядра).

       ENOTDIR
              Компонент в префиксе пути pathname не является каталогом.

       ENOTDIR
              (fstatat())   Значение  pathname  содержит  относительный  путь  и  dirfd  содержит
              файловый дескриптор, указывающий на файл, а не на каталог.

       EOVERFLOW
              Значение pathname или fd ссылаются на файл, чей размер, номер inode или  количество
              блоков  не  может  быть  представлено  с  помощью  типов off_t, ino_t или blkcnt_t,
              соответственно. Эта ошибка может возникнуть, если, например, приложение собрано  на
              32-битной  платформе  без флага -D_FILE_OFFSET_BITS=64 при вызове stat() для файла,
              чей размер превышает (1<<31)-1 байт.

ВЕРСИИ

       fstatat()  was added in Linux 2.6.16; library support was added in glibc 2.4.

СТАНДАРТЫ

       stat(), fstat(), lstat(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1.2008.

       fstatat(): POSIX.1-2008.

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

       Использование  полей  st_blocks  и st_blksize может усложнить перенос на другие платформы.
       (Эти поля появились из BSD. Их смысл различается в разных системах  и,  вероятно,  даже  в
       одной системе при использовании NFS).

ЗАМЕЧАНИЯ

   Отличия между библиотекой C и ядром
       В течении долгого времени увеличение размера структуры stat привело к появлению трёх новых
       версий  stat():  sys_stat()  (слот  __NR_oldstat),  sys_newstat()   (слот   __NR_stat)   и
       sys_stat64() (слот __NR_stat64) на 32-битных платформах, например, i386. Первые две версии
       уже существовали в Linux 1.0 (но под другими именами); последняя была  добавлена  в  Linux
       2.4. Подобное замечание применимо к fstat() и lstat().

       Внутренние ядерные структуры 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().

ПРИМЕРЫ

       Следующая программа вызывает lstat() и показывает некоторые поля из  полученной  структуры
       stat.

       #include <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/stat.h>
       #include <sys/sysmacros.h>
       #include <time.h>

       int
       main(int argc, char *argv[])
       {
           struct stat sb;

           if (argc != 2) {
               fprintf(stderr, "Использование: %s <путь>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (lstat(argv[1], &sb) == -1) {
               perror("lstat");
               exit(EXIT_FAILURE);
           }

           printf("ID содержащего устройства:  [%x,%x]\n",
                  major(sb.st_dev),
                  minor(sb.st_dev));

           printf("Тип файла:                ");

           switch (sb.st_mode & S_IFMT) {
           case S_IFBLK:  printf("блочное устройство\n");     break;
           case S_IFCHR:  printf("символьное устройство\n");  break;
           case S_IFDIR:  printf("каталог\n");                break;
           case S_IFIFO:  printf("FIFO/канал\n");             break;
           case S_IFLNK:  printf("символьная ссылка\n");      break;
           case S_IFREG:  printf("обычный файл\n");           break;
           case S_IFSOCK: printf("сокет\n");                  break;
           default:       printf("неизвестно?\n");            break;
           }

           printf("номер inode:            %ju\n", (uintmax_t) sb.st_ino);

           printf("Режим доступа:            %jo (octal)\n",
                  (uintmax_t) sb.st_mode);

           printf("Link count:               %ju\n", (uintmax_t) sb.st_nlink);
           printf("Ownership:                UID=%ju   GID=%ju\n",
                  (uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid);

           printf("Preferred I/O block size: %jd bytes\n",
                  (intmax_t) sb.st_blksize);
           printf("File size:                %jd bytes\n",
                  (intmax_t) sb.st_size);
           printf("Blocks allocated:         %jd\n",
                  (intmax_t) sb.st_blocks);

           printf("Посл. изм. состояния:     %s", ctime(&sb.st_ctime));
           printf("Посл. доступ к файлу:     %s", ctime(&sb.st_atime));
           printf("Посл. изм. файла:         %s", ctime(&sb.st_mtime));

           exit(EXIT_SUCCESS);
       }

СМ. ТАКЖЕ

       ls(1),   stat(1),   access(2),   chmod(2),   chown(2),  readlink(2),  statx(2),  utime(2),
       stat(3type), capabilities(7), inode(7), symlink(7)

ПЕРЕВОД

       Русский   перевод   этой   страницы   руководства    был    сделан    Alexander    Golubev
       <fatzer2@gmail.com>,   Azamat   Hackimov  <azamat.hackimov@gmail.com>,  Hotellook,  Nikita
       <zxcvbnm3230@mail.ru>,       Spiros       Georgaras       <sng@hellug.gr>,       Vladislav
       <ivladislavefimov@gmail.com>,    Yuri    Kozlov   <yuray@komyakino.ru>   и   Иван   Павлов
       <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.