Man:Man2/stat.2

Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.

Перейти до: навігація, пошук


Зміст

Назва

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)

Особисті інструменти