Книга: Разработка ядра Linux

Объект file

Последним из основных объектов подсистемы VFS рассмотрим объект файла. Объект File используется для представления файлов, которые открыты процессом. Когда мы думаем о подсистеме VFS с точки зрения пространства пользователя, то объект файла — это то, что первое приходит в голову. Процессы непосредственно работают с файлами, а не с суперблоками, индексами или элементами каталогов. Не удивительно, что информация, которая содержится в объекте file, наиболее привычна (такие данные, как режим доступа или текущее смещение), а файловые операции очень похожи на знакомые системные вызовы, такие как read() и write().

Объект файла — это представление открытого файла, которое хранится в оперативной памяти. Объект (а не сам файл) создается в ответ на системный вызов open() и уничтожается в результате системного вызова close(). Все вызовы, связанные с файлом, на самом деле являются методами, которые определены в таблице операций с файлом. Так как несколько процессов могут одновременно открыть и использовать один и тот же файл, то для одного файла может существовать несколько объектов file. Файловый объект просто представляет открытый файл с точки зрения процесса. Этот объект содержит указатель на соответствующий элемент каталога (который, в свою очередь, указывает на файловый индекс), представляющий открытый файл. Соответствующие объекты inode и dentry, конечно, являются уникальными.

Файловый объект представляется с помощью структуры struct file, которая определена в файле <linux/fs.h>. Рассмотрим поля этой структуры с комментариями, которые описывают назначение каждого поля.

struct file {
 struct list_head       f_list;      /* список объектов file */
 struct dentry          *f_dentry;   /* связанный объект dentry */
 struct vfsmount        *f_vfsmnt;   /* связанная смонтированная
                                        файловая система */
 struct file_operations *f_op;       /* таблица файловых операций */
 atomic_t               f_count;     /* счетчик ссылок на этот объект */
 unsigned int           f_flags;     /* флаги, указанные
                                        при вызове функции open */
 mode_t                 f_mode;      /* режим доступа к файлу */
 loff_t                 f_pos;       /* смещение в файле
                                        (file pointer, offset) */
 struct fown_struct     f_owner; /* информация о владельце для обработки
                                    сигналов */
 unsigned int           f_uid; /* идентификатор пользователя владельца, UID */
 unsigned int           f_gid; /* идентификатор группы владельца, GID */
 int                    f_error;     /* код ошибки */
 struct file_ra_state   f_ra; /* состояние предварительного считывания */
 unsigned long          f_version;   /* номер версии */
 void                   *f_security; /* модуль безопасности */
 void                   *private_data; /* привязка для
                                          драйвера терминала */
 struct list_head       f_ep_links;  /* список ссылок eventpoll
                                        (опрос событий) */
 spinlock_t             f_ep_lock;   /* блокировка eventpoll */
 struct address_space   *f_mapping;  /* отображение в страничном кэше */
};

По аналогии с объектом элемента каталога объект файла на самом деле не соответствует никакой структуре, которая хранится на жестком диске. Поэтому в этой структуре нет никакого флага, который бы указывал, что объект изменен (dirty) и требует обратной записи на диск. Объект file указывает на связанный с ним объект dentry с помощью указателя f_dentry. Объект dentry в свою очередь содержит указатель на связанный с ним индекс файла, который содержит информацию о том, изменен ли файл.

Оглавление книги

Оглавление статьи/книги

Генерация: 0.718. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз