ИМЯ
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, но вместо file_name возвращается информация о filedes (который возвращается системным вызовом open(2)).
Все эти функции возвращают структуру stat, которая содержит такие поля:
struct stat {
dev_t st_dev; /*
устройство
*/
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; /* тип
устройства
*/
/* (если это
устройство)
*/
off_t st_size; /* общий
размер в
байтах */
unsigned long st_blksize; /*
размер
блока
ввода-вывода
*/
/* в
файловой
системе */
unsigned long st_blocks; /*
количество
выделенных
блоков */
time_t st_atime; /* время
последнего
доступа */
time_t st_mtime; /* время
последней
модификации
*/
time_t st_ctime; /* время
последнего
изменения
*/
};
Значение st_size дает размер файла в байтах (если это обычный файл или символьная ссылка). Размер символьной ссылки равен длине пути, который она содержит, без концевого NUL.
Значение st_blocks задает размер файла в 512-байтных блоках. Значение st_blksize задает "предпочтительный" размер блока для эффективного ввода-вывода на файловой системе. (Запись в файл более мелкими порциями может привести к неэффективному чтению-изменению-повторной записи).
Не все файловые системы под Linux реализуют все метки времени. Некоторые файловые системы позволяют монтировать так, что обращения к файлам не изменяют поле st_atime. (См. ’noatime’ в mount(8).
Поле st_atime изменяется при доступе к файлу, например, при exec(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 определены для проверки типа файлов:
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:
Бит setgid (S_ISGID) имеет несколько специальных применений: На каталоге он означает, что для этого каталога используется семантика BSD: файлы, создаваемые в нем, наследуют свою группу-владельца от этого каталога, а не от фактической группы-владельца процесса, создавшего файл, а на подкаталогах, которые созданы в этом каталоге, также будет установлен бит S_ISGID. Для файла, которые не имеет бит выполнения группой (S_IXGRP), бит setgid означает жесткую блокировку файла/записей.
Бит "липкости" (S_ISVTX) на каталоге означает, что файлы в этом каталоге могут быть удалены или переименованы только владельцем файла, владельцем каталога, и суперпользователем.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха возвращается ноль. При ошибке возвращается −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. SVr4 документирует дополнительные коды ошибок 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, но будут присутствовать в следующем стандарте POSIX; первый из них взят из SVID 4v2, второй -- из SUSv2.
Unix V7 (и более поздние системы) имеют S_IREAD, S_IWRITE, S_IEXEC, тогда как POSIX требует присутствия синонимов S_IRUSR, S_IWUSR, S_IXUSR.
ДРУГИЕ СИСТЕМЫ
Значения, которые использовались или используются на различных системах:
Липкие команды появились в Version 32V AT&T UNIX.
СМОТРИ ТАКЖЕ
chmod(2), chown(2), readlink(2), utime(2)
ПЕРЕВОД
Copyright (C) Alexey Mahotkin <alexm [AT] hsys.ru> 1999-2001