Прототипы системных вызовов
#include <sys/stat.h>
#include <unistd.h>
int stat(char *filename, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(char *filename, struct stat *buf);
Описание системных вызовов
Настоящее описание не является полным описанием этих системных вызовов, а приспособлено для целей данного курса. Для получения полного описания обращайтесь в UNIX Manual.
Системные вызовы stat, fstat и lstat служат для получения информации об атрибутах файла.
Системный вызов stat читает информацию об атрибутах файла, на чье имя указывает параметр filename, и заполняет ими структуру, расположенную по адресу buf. Заметим, что имя файла должно быть полным, либо строиться относительно той директории, которая является текущей для процесса, совершившего вызов. Если имя файла относится к файлу типа "связь", то читается информация (рекурсивно!) об атрибутах файла, на который указывает символическая связь.
Системный вызов lstat идентичен системному вызову stat за одним исключением: если имя файла относится к файлу типа "связь", то читается информация о самом файле типа "связь".
Системный вызов fstat идентичен системному вызову stat, только файл задается не именем, а своим файловым дескриптором (естественно, файл к этому моменту должен быть открыт).
Для системных вызовов stat и lstat процессу не нужны никакие права доступа к указанному файлу, но могут понадобиться права для поиска во всех директориях, входящих в специфицированное имя файла.
Структура stat в различных версиях UNIX может быть описана по-разному. В Linux она содержит следующие поля:
struct
stat {
dev_t
st_dev; /* устройство, на котором расположен
файл */
ino_t st_ino; /* номер индексного узла для файла
*/
mode_t st_mode; /* тип файла и права доступа
к нему */
nlink_t st_nlink; /* счетчик числа жестких связей
*/
uid_t st_uid; /* идентификатор пользователя
владельца */
gid_t st_gid; /* идентификатор группы владельца
*/
dev_t st_rdev; /* тип устройства для специальных
файлов устройств */
off_t st_size; /* размер файла в байтах (если
определен для данного типа файлов) */
unsigbed long st_blksize; /* размер блока для
файловой системы */
unsigned long st_blocks; /* число выделенных
блоков */
time_t st_atime; /* время последнего доступа
к файлу */
time_t st_mtime; /* время последней модификации
файла */
time_t st_ctime; /* время создания файла */
}
Для определения типа файла можно использовать следующие логические макросы, применяя их к значению поля st_mode:
S_ISLNK(m)
- файл типа "связь"?
S_ISREG(m) - регулярный файл?
S_ISDIR(m) - директория?
S_ISCHR(m) - специальный файл символьного устройства?
S_ISBLK(m) - специальный файл блочного устройства?
S_ISFIFO(m) - файл типа FIFO?
S_ISSOCK(m) - файл типа socket?
Младшие 9 бит поля st_mode определяют права доступа к файлу подобно тому, как это делается в маске создания файлов текущего процесса.
Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.