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, только возвращается информация об открытом файле, на который указывает filedes (возвращаемый open(2)), а не о file_name.
Все эти функции возвращают структуру stat, которая содержит следующие поля:
struct stat {
    dev_t         st_dev;      /* устройство */
    ino_t         st_ino;      /* inode */
    mode_t        st_mode;     /* режим доступа */
    nlink_t       st_nlink;    /* количество жестких ссылок */
    uid_t         st_uid;      /* идентификатор пользователя-владельца */
    gid_t         st_gid;      /* идентификатор группы-владельца */
    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 задает размер файла (если он обычный или является символьной ссылкой) в байтах. Размер символьной ссылки - длина пути файла на который она сылается, без конечного NUL.
Поле st_blocks задает размер файла в 512-байтных блоках. (Оно может быть меньше, чем st_size/512 например, когда в файле есть пропуски.) st_blksize задает "предпочтительный" размер блока для эффективного ввода/вывода в файловой системе. (Запись в файл более мелкими порциями может привести к некорректному чтению/изменению/повторной записи информации).
Некоторые файловые системы Linux не реализуют все метки времени. Некоторые файловые системы позволяют обращаться к файлам так, что не происходит никаких изменений в поле 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 изменяется при записи или установке информации об inode (владельце, группе, количестве ссылок, режиме и т.д.).
Указанные далее макросы POSIX проверяют, является ли файл:
Описанные ниже флаги определены для поля 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 | 
| S_ISUID | 0004000 | бит setuid | 
| S_ISGID | 0002000 | бит setgid (смотри ниже) | 
| 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 | все прочие имеют права выполнения | 
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, но оба они могут быть в следующем стандарте POSIX; бывший SVID 4v2, последний SVIDv2. Unix V7 (и более поздние системы) имеют S_IREAD, S_IWRITE, S_IEXEC, тогда как POSIX требует присутствия синонимов S_IRUSR, S_IWUSR, S_IXUSR.
| hex | имя | ls | oct | описание | 
| 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 | семафор XENIX, подтип IFNAM | 
| 0002 | S_INSHD | m | 000002 | разделяемые данные XENIX, подтип IFNAM | 
| 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" on VxFS) | 
| d000 | S_IFDOOR | D> | 150000 | Solaris: door | 
| e000 | S_IFWHT | w% | 160000 | BSD whiteout (не используется для inode'ов) | 
| 0200 | S_ISVTX | 001000 | Бит принадлежности: сохраняет код | |
| программы в файле подкачки даже после | ||||
| использования (V7) | ||||
| зарезервировано (SVID-v2) | ||||
| В некаталогах: не кэшировать этот | ||||
| файл (SunOS) | ||||
| В каталогах: флаг ограниченного | ||||
| удаления (SVID-v4.2) | ||||
| 0400 | S_ISGID | 002000 | установить идентификатор группы при | |
| выполнении (V7) | ||||
| для каталогов: использовать семантику | ||||
| BSD для установки группы-владельца | ||||
| 0400 | S_ENFMT | 002000 | жесткая блокировка файлов в стиле SysV | |
| (делит функции c S_ISGID) | ||||
| 0800 | S_ISUID | 004000 | установить идентификатор пользователя | |
| при выполнении (V7) | ||||
| 0800 | S_CDF | 004000 | каталог является файлом, зависящим от контекста (HP-UX) | 
| Закладки на сайте Проследить за страницей | Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |