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-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |