stat

STAT(2)         Ð ÑководÑÑво пÑогÑаммиÑÑа Linux         STAT(2)



ÐÐЯ
       stat, fstat, lstat, fstatat - ÑÑиÑÑÐ²Ð°ÐµÑ ÑоÑÑоÑние Ñайла

ÐÐÐÐÐ
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>

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

       #include <fcntl.h>           /* опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑÐ°Ð½Ñ AT_* */
       #include <sys/stat.h>

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

   ТÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÐºÑоÑа ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвойÑÑв Ð´Ð»Ñ glibc
   (Ñм. feature_test_macros(7)):

       lstat():
           /* glibc 2.19 и ÑÑаÑее */ _BSD_SOURCE
               || /* наÑÐ¸Ð½Ð°Ñ Ñ glibc 2.20 */ _DEFAULT_SOURCE
               || _XOPEN_SOURCE >= 500
               || /* наÑÐ¸Ð½Ð°Ñ Ñ glibc 2.10: */ _POSIX_C_SOURCE >= 200112L

       fstatat():
           ÐаÑÐ¸Ð½Ð°Ñ Ñ glibc 2.10:
               _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,
       коÑоÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ ÑледÑÑÑие полÑ:

           struct stat {
               dev_t     st_dev;         /* ID ÑÑÑÑойÑÑва Ñ Ñайлом */
               ino_t     st_ino;         /* Ð½Ð¾Ð¼ÐµÑ inode */
               mode_t    st_mode;        /* пÑава и Ñежим доÑÑÑпа */
               nlink_t   st_nlink;       /* кол-во жÑÑÑÐºÐ¸Ñ ÑÑÑлок */
               uid_t     st_uid;         /* ID полÑзоваÑелÑ-владелÑÑа */
               gid_t     st_gid;         /* ID гÑÑппÑ-владелÑÑа */
               dev_t     st_rdev;        /* ID ÑÑÑÑойÑÑва (еÑли ÑÑо ÑпеÑ. Ñайл) */
               off_t     st_size;        /* полнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð² байÑÐ°Ñ */
               blksize_t st_blksize;     /* ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° ввода-вÑвода
                                            Ñайловой ÑиÑÑÐµÐ¼Ñ */
               blkcnt_t  st_blocks;      /* кол-во вÑделеннÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² по 512Ð */

               /* ÐаÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6, ÑдÑо поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑоÑноÑÑÑ Ð´Ð¾
                  наноÑекÑнд в ÑледÑÑÑÐ¸Ñ Ð¿Ð¾Ð»Ñм меÑок вÑемени.
                  ÐодÑобней о веÑÑиÑÑ Ð´Ð¾ Linux 2.6, ÑмоÑÑиÑе ÐÐÐÐЧÐÐÐЯ. */

               struct timespec st_atim;  /* вÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего доÑÑÑпа */
               struct timespec st_mtim;  /* вÑÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ */
               struct timespec st_ctim;  /* вÑÐµÐ¼Ñ Ð¿Ð¾Ñледней ÑÐ¼ÐµÐ½Ñ ÑоÑÑоÑÐ½Ð¸Ñ */

           #define st_atime st_atim.tv_sec      /* Ð´Ð»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };

       ÐамеÑание: поÑÑдок полей ÑÑÑÑкÑÑÑÑ 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

       Таким обÑазом, ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ Ð¾Ð±ÑÑнÑй Ñайл
       (напÑимеÑ) на возможноÑÑÑ Ð·Ð°Ð¿Ð¸Ñи:

           stat(pathname, &sb);
           if ((sb.st_mode & S_IFMT) == S_IFREG) {
               /* обÑабоÑка обÑÑного Ñайла */
           }

       Так как пÑиведÑнное вÑÑе ÑеÑÑиÑование
       Ð¸Ð¼ÐµÐµÑ Ð¾Ð±Ñий вид, в 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.)

       Таким обÑазом, Ñанее показаннÑй ÑÑагменÑ
       кода можно пеÑепиÑаÑÑ ÐºÐ°Ðº:

           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 или
       более.

       ÐпÑеделение 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()
       СиÑÑемнÑй вÑзов fstatat() ÑабоÑÐ°ÐµÑ Ñакже как
       ÑиÑÑемнÑй вÑзов stat(), за иÑклÑÑением ÑлÑÑаев,
       опиÑаннÑÑ Ð·Ð´ÐµÑÑ.

       ÐÑли в 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().

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении возвÑаÑаеÑÑÑ 0. Ð
       ÑлÑÑае оÑибки возвÑаÑаеÑÑÑ -1, а errno
       ÑÑÑанавливаеÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑее знаÑение.

ÐШÐÐÐÐ
       EACCES ÐапÑеÑÑн поиÑк в одном из каÑалогов
              пÑÑи pathname (ÑмоÑÑиÑе Ñакже path_resolution(7)).

       EBADF  ÐнаÑение fd не ÑвлÑеÑÑÑ Ð¿ÑавилÑнÑм оÑкÑÑÑÑм
              ÑайловÑм деÑкÑипÑоÑом.

       EFAULT ÐепÑавилÑнÑй адÑеÑ.

       ELOOP  Ðо вÑÐµÐ¼Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑи вÑÑÑеÑилоÑÑ
              ÑлиÑком много ÑимволÑнÑÑ ÑÑÑлок.

       ENAMETOOLONG
              СлиÑком длинное знаÑение аÑгÑменÑа
              pathname.

       ENOENT ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¿ÑÑи pathname не ÑÑÑеÑÑвÑÐµÑ Ð¸Ð»Ð¸ в
              pathname Ñказана пÑÑÑÐ°Ñ ÑÑÑока.

       ENOMEM Ðе ÑваÑÐ°ÐµÑ Ð¿Ð°Ð¼ÑÑи (напÑимеÑ, памÑÑи ÑдÑа).

       ENOTDIR
              ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð² пÑеÑикÑе пÑÑи pathname не
              ÑвлÑеÑÑÑ ÐºÐ°Ñалогом.

       EOVERFLOW
              ÐнаÑение pathname или fd ÑÑÑлаÑÑÑÑ Ð½Ð° Ñайл,
              Ñей ÑазмеÑ, Ð½Ð¾Ð¼ÐµÑ inode или колиÑеÑÑво
              блоков не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедÑÑавлено Ñ
              помоÑÑÑ Ñипов off_t, ino_t или blkcnt_t,
              ÑооÑвеÑÑÑвенно. ÐÑа оÑибка можеÑ
              возникнÑÑÑ, еÑли, напÑимеÑ, пÑиложение
              ÑобÑано на 32-биÑной плаÑÑоÑме без
              Ñлага -D_FILE_OFFSET_BITS=64 пÑи вÑзове stat() длÑ
              Ñайла, Ñей ÑÐ°Ð·Ð¼ÐµÑ Ð¿ÑевÑÑÐ°ÐµÑ (1<<31)-1 байÑ.

       Ð fstatat() дополниÑелÑно могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ
       ÑледÑÑÑие оÑибки:

       EBADF  ÐнаÑение dirfd не ÑвлÑеÑÑÑ Ð¿ÑавилÑнÑм
              ÑайловÑм деÑкÑипÑоÑом.

       EINVAL Указано невеÑное знаÑение в flags.

       ENOTDIR
              ÐнаÑение pathname ÑодеÑÐ¶Ð¸Ñ Ð¾ÑноÑиÑелÑнÑй
              пÑÑÑ Ð¸ dirfd ÑодеÑÐ¶Ð¸Ñ ÑайловÑй деÑкÑипÑоÑ,
              ÑказÑваÑÑий на Ñайл, а не на каÑалог.

ÐÐРСÐÐ
       ÐÑзов fstatat() бÑл добавлен в ÑдÑо Linux веÑÑии
       2.6.16; поддеÑжка в 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). ÐÑли
       вам нÑжно полÑÑиÑÑ Ð¾Ð¿Ñеделение Ñипа 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.

   ÐÑÑгие ÑиÑÑемÑ
       ÐнаÑениÑ, коÑоÑÑе иÑполÑзовалиÑÑ (или
       иÑполÑзÑÑÑÑÑ) в ÑазлиÑнÑÑ ÑиÑÑемаÑ:

       ÑеÑ.   наименование   ÑÑÑ.   воÑ.   пÑимеÑание
       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                    l@     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.

ÐÐÐÐЧÐÐÐЯ
       Ð Linux lstat(), обÑÑно, не вÑзÑваеÑ
       авÑомаÑиÑеÑкое монÑиÑование, в оÑлиÑие оÑ
       stat() (но ÑмоÑÑиÑе fstatat(2)).

       ÐÐ»Ñ Ð¿ÑевдоÑайлов, авÑомаÑиÑеÑки генеÑиÑÑемÑÑ
       ÑдÑом, stat() не возвÑаÑÐ°ÐµÑ ÑоÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ñайла
       в поле st_size. ÐапÑимеÑ, знаÑение 0
       возвÑаÑаеÑÑÑ Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ Ñайлов каÑалога
       /proc, а Ð´Ð»Ñ ÑазлиÑнÑÑ Ñайлов из каÑалога /sys
       возвÑаÑаеÑÑÑ ÑÐ°Ð·Ð¼ÐµÑ 4096 Ð±Ð°Ð¹Ñ Ð´Ð°Ð¶Ðµ когда
       ÑодеÑжимое Ñайла менÑÑе ÑÑого знаÑениÑ. Ðз
       ÑÐ°ÐºÐ¸Ñ Ñайлов нÑжно пÑоÑÑо ÑиÑаÑÑ Ð²Ñе
       возможнÑе байÑÑ (и добавлÑÑÑ '\0' в
       возвÑаÑаемÑй бÑÑеÑ, еÑли он ÑÑиÑаеÑÑÑ ÑÑÑокой).

   ÐÐ¾Ð»Ñ Ñ Ð¾ÑмеÑками вÑемени
       Ð ÑÑаÑÑÑ ÑдÑÐ°Ñ Ð¸ ÑÑандаÑÑÐ°Ñ Ð½ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑжки полей
       вÑемени в наноÑекÑндаÑ. ÐмеÑÑо Ð½Ð¸Ñ ÐµÑÑÑ ÑÑи
       поÑÑ Ð²Ñемени â st_atime, st_mtime и st_ctime â Ñ Ñипом
       time_t, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ ÑекÑнднÑÑ ÑоÑноÑÑÑ.

       ÐаÑÐ¸Ð½Ð°Ñ Ñ ÑдÑа 2.5.48, в ÑÑÑÑкÑÑÑе stat
       поддеÑживаеÑÑÑ Ð½Ð°Ð½Ð¾ÑекÑÐ½Ð´Ð½Ð°Ñ ÑоÑноÑÑÑ Ð´Ð»Ñ
       вÑÐµÑ ÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ¹ вÑемени. ÐаноÑекÑнднÑе
       компоненÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð¹ меÑки вÑемени доÑÑÑпнÑ
       под именами вида st_atim.tv_nsec, еÑли
       опÑеделÑн подÑодÑÑий макÑÐ¾Ñ ÑеÑÑиÑованиÑ
       ÑвойÑÑв. ÐаноÑекÑнднÑе меÑки вÑемени
       ÑÑандаÑÑÐ¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð² POSIX.1-2008, и, наÑÐ¸Ð½Ð°Ñ Ñ
       веÑÑии 2.12, в glibc Ñакже еÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка имÑн
       наноÑекÑнднÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ, еÑли опÑеделÑн
       _POSIX_C_SOURCE Ñо знаÑением 200809L или более, или
       _XOPEN_SOURCE Ñо знаÑением 700 или более. Ðо glibc
       2.19 вклÑÑиÑелÑно опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð°Ð½Ð¾ÑекÑнднÑÑ
       ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ñакже доÑÑÑпнÑ, еÑли опÑеделÑн
       _BSD_SOURCE или _SVID_SOURCE. ÐÑли ни один из
       вÑÑеÑпомÑнÑÑÑÑ Ð¼Ð°ÐºÑоÑов не опÑеделÑн, Ñо
       наноÑекÑнднÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð¿Ð¾Ð´
       именами вида st_atimensec.

       ÐаноÑекÑнднÑе меÑки вÑемени поддеÑживаÑÑÑÑ
       в XFS, JFS, Btrfs и ext4 (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.23).
       ÐаноÑекÑнднÑе меÑки вÑемени не
       поддеÑживаÑÑÑÑ Ð² ext2, ext3 и Reiserfs. Ð ÑайловÑÑ
       ÑиÑÑемаÑ, не поддеÑживаÑÑÐ¸Ñ Ð´Ð¾ÑекÑнднÑе
       меÑки вÑемени, в наноÑекÑнднÑÑ Ð¿Ð¾Ð»ÑÑ
       возвÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение 0.

   ÐÑлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой 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().

ÐÐ ÐÐÐÐ
       СледÑÑÑÐ°Ñ Ð¿ÑогÑамма вÑзÑÐ²Ð°ÐµÑ stat() и
       показÑÐ²Ð°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе Ð¿Ð¾Ð»Ñ Ð¸Ð· полÑÑенной
       ÑÑÑÑкÑÑÑÑ stat.

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

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

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

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

           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:              %ld\n", (long) sb.st_ino);

           printf("Режим доÑÑÑпа:            %lo (octal)\n",
                   (unsigned long) sb.st_mode);

           printf("Ðол-во ÑÑÑлок:            %ld\n", (long) sb.st_nlink);
           printf("ÐладелеÑ:                 UID=%ld   GID=%ld\n",
                   (long) sb.st_uid, (long) sb.st_gid);

           printf("ÐÑедпоÑ. ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð». в/в:  %ld байÑ\n",
                   (long) sb.st_blksize);
           printf("Ð Ð°Ð·Ð¼ÐµÑ Ñайла:             %lld байÑ\n",
                   (long long) sb.st_size);
           printf("ÐÑделено блоков:          %lld\n",
                   (long long) 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), utime(2),
       capabilities(7), symlink(7)



Linux                             2016-03-15                           STAT(2)