Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мои шпоры ОСиСП(1).doc
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
1.63 Mб
Скачать

Билет 6

  1. Метаданные файлов в ос unix (7) – 36

Каждый файл имеет, помимо своих собственных данных, метаданные, которые описывают его характеристики, такие, как разрешения на доступ к файлу, временная отметка, указывающая время последнего доступа к файлу, владелец, группа и размер файла, а также местоположение данных файла. Метаданные файла хранятся в структуре индексного дескриптора (inode). Часть полей этой структуры можно получить с помощью следующих системных вызовов:

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

Int stat(const char *path, struct stat *buf);

Int fstаt(int fd, struct stat *buf);

Int lstat(const char *path, struct stat *buf);

Где параметр path – это полный путь к файлу, а fd – открытый файловый дескриптор.

Cистемный вызов lstat отличается от stat тем, что он позволяет получить информацию о файле типа символьная ссылка. При успешном завершении вызовов возвращается 0 и в структуру stat (рассмотренную ниже) помещаются метаданные, а при ошибке возвращается значение -1 и устанавливаются коды ошибок в errno:

EACCESS – у вызывающего процесса отсутствуют разрешения на поиск для одного из

каталогов в пути path (только для функций stat () и lstat ()).

EBADF – недопустимое значение fd (только для функции fstat()).

EFAULT – параметр path или buf содержит недопустимый указатель.

ELOOP – параметр path включает слишком много символических ссылок (только для

функций stat() и Istat()).

ENAMETOOLONG – слишком длинное значение параметра path (только для функций stat() и

Istat()).

ENOENT – компонент пути path не существует (только для функций stat() и Istat()).

ENOMEM – недостаточно памяти для выполнения данного запроса.

ENOTDIR – компонент пути path не является каталогом (только для функций stat() и

Istat()).

struct stat

{

  1. dev_t st_dev; //устройство, на котором хранится файл

  2. ino_t st_ino; //номер inode (индексного дескриптора)

  3. mode_t st_mode; //режимы использования файла

  4. nlink_t st_nlink; //число жестких ссылок

  5. uid_t st_uid; //идентификатор пользователя владельца

  6. gid_t st_gid; //идентификатор группы владельца

  7. dev_t st_rdev; //если этот файл – устройство, то описано устройство, которое

файл представляет

  1. off_t st_size; //размер файла в байтах

  2. blksize_t st_blksize; //размер блока для эффективной реализации ввода/вывода

  3. blkcnt_ st_blocks; //число блоков физической файловой системы, которое

занимает файл

  1. time_t st_atime; //время последнего доступа к файлу

  2. time_t st_mtime; //время последней модификации метаданных файла

  3. time_t st_ctime; //время последнего изменения файла

}

Для определения типа файла используются специальные значения st_mode:

S_ISFIFO(mode) - канал

S_ISCHR(mode) - символьное устройство

S_ISDIR(mode) - каталог

S_ISBLK(mode) - блочное устройство

S_ISREG(mode) - обычный файл

S_ISLNK(mode) - ссылка

S_ISSOCK(mode) - сокет

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]