Назва

stat, fstat, lstat - одержують статус файлу

Стисло

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

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 , але статистичну інформацію можна отримати тільки щодо відкритого файлу (дивіться open(2)), на який вказує дескриптор filedes.

Усі вони повертають структуру stat, яка містить наступні поля:

     struct stat {
       dev_t      st_dev;     /* прилад */
       ino_t      st_ino;     /* індексний номер */
       mode_t     st_mode;    /* захист */
       nlink_t    st_nlink;   /* кількість жорстких посилань */
       uid_t      st_uid;     /* користувацький ID власника */
       gid_t      st_gid;     /* ID групи власника */
       dev_t      st_rdev;    /* тип приладу */
       off_t      st_size;    /* загальний розмір, в байтах */
       blksize_t  st_blksize; /* розмір блоку для операцій вводу/виводу */
       blkcnt_t   st_blocks;  /* кількість виділених блоків */
       time_t     st_atime;   /* час останнього доступу */
       time_t     st_mtime;   /* час останньої модифікації */
       time_t     st_ctime;   /* час останньої зміни статусу */
     };

Значення st_size містить розмір файлу в байтах (якщо це звичайний файл або символічне посилання). Розмір символічного посилання рівний довжині ланцюжка шляху, який він містить, без кінцевого NULL.

Значення st_blocks включає розмір файлу, розбитий на 512-байтові блоки. (Цей розмір може виявитись меншим за st_size/151, якщо файл містить дірки.) Значення st_blksize містить "бажаний" для ефективності операцій вводу/виводу розмір у блоках. (Запис до файлу менших відрізків може призвести до неефективного запису-модифікації-перезапису.)

Не кожна файлова система Лінукса втілює всі поля часу. Деякі файлові системи дозволяють приєднання в такий спосіб, що доступ до файлу не спричинює оновлення поля 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 змінюється у випадку запису або встановлення даних індексного вузла (тобто, інформації про власника, групу, кількість посилань, режим, і так далі.)

Наступні макроси POSIX означено для перевірки типу файлу:

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.)

Наступні прапорці означено для поля st_mode:

"S_IFMT 017000": бітова маска для біт-полів файлового типу

"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" : встановлює біт UID

"S_ISGID 0002000" : встановлює біт GID

"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" : решта має дозвіл на виконання

Встановлення біту GID (S_ISGID) має декілька значень. Для каталогу він означає, що використовуватиметься семантика BSD - створені там файли успадковують ID групи цього каталогу, а не згідно з чинним ID процесу, що створив файл. Створені там каталоги також отримають встановлений біт S_ISGID. Інше - для файлів, які не мають встановленим біт виконання групою (S_IXGRP), GID вказує на обов'язкове блокування файлу (реєстраційного запису).

Стійкий біт (S_ISVTX) у випадку каталогу означає, що файл у цьому каталозі може перейменувати або видалити тільки власник файлу, власник каталогу і root-користувач.

Повернені значення

При вдалому виконанні, повертається нуль. У випадку помилки, буде повернено -1 і errno набуде відповідного значення.

Коди помилок

EBADF : поганий дескриптор filedes .

ENOENT : Якась складова назви шляху file_name не існує, або шлях вказано як порожній ланцюжок.

ENOTDIR : Якась складова назви шляху не є каталогом.

ELOOP : Забагато символічних посилань під час спроби розв'язання шляху.

EFAULT : Погана адреса.

EACCES : Відмова у доступі.

ENOMEM : Недостатньо пам'яті (ядра).

ENAMETOOLONG : Назва файлу занадто довга.

Відповідність стандартам

Виклики stat і fstat узгоджуються з SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Виклик lstat відповідає 4.3BSD і SVr4. SVr4 згадує додаткові помилки fstat - EINTR, ENOLINK і EOVERFLOW, а для stat і lstat - EACCES, EINTR, EMULTIHOP, ENOLINK і EOVERFLOW. Використання полів st_blocks і st_blksize може виявитись не настільки портабельним. (Вони з'явилися в BSD і не згадуються POSIX. Їхня інтерпретація відрізняється в різних системах, і, можливо, на тій самій системі, коли приєднано файлову систему NFS.)

У 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, зате очікуються в наступному виданні стандарту; перший макрос походить з SVID 4v2, тоді як другий - з SUSv2.

Unix V7 (і пізніші версії) мали S_IREAD, S_IWRITE, S_IEXEC, тоді як POSIX приписує синоніми S_IRUSR, S_IWUSR, S_IXUSR.

Інші системи

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

шістн. назва вивід ls вісімк. опис :


:

f000 S_IFMT 170000 : маска для типу файлу

0000 000000 : непридатний індексний вузол (SCO); невідомий тип (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 : тіньовий і-вузол для ACL (невидимий з користувацького простору) (Solaris)

c000 S_IFSOCK s= 140000 : сокет (BSD); так само S_IFSOC на VxFS)

d000 S_IFDOOR D> 150000 : "дверцята" Solaris

e000 S_IFWHT w% 160000 : whiteout BSD (не використовується для і-вузла)

0200 S_ISVTX 001000 : &"стійкий біт": зберігає текст в свопі, навіть після використання (V7); резервований файл (SVID-v2); у випадку не-каталогів: не кешувати цей файл (SunOS); у випадку не-каталогів: прапорець обмеження видалення (SVID-v4.2)

0400 S_ISGID 002000 : встановлює ID групи при виконанні (V7); у випадку каталогів: використовує семантуку BSD для встановлення ID групи

0400 S_ENFMT 002000 : примусове блокування файлів SysV

0800 S_ISUID 004000 : встановлює ID користувача при виконанні (V7)

0800 S_CDF 004000 : каталог являється файлом, залежним від контексту (HP-UX)

Стійкий біт з'явився у Версії 32V UNIX-а від AT&T.

Дивіться також

chmod(2), chown(2), ?readlink(2), ?utime(2)