Объект file

We use cookies. Read the Privacy and Cookie Policy

Объект 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 в свою очередь содержит указатель на связанный с ним индекс файла, который содержит информацию о том, изменен ли файл.