Разработка ядра Linux
Шрифт:
файловая система */
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 в свою очередь содержит указатель на связанный с ним индекс файла, который содержит информацию о том, изменен ли файл. Файловые операции
Как и для других объектов подсистемы VFS, таблица файловых операций является важной структурой. Операции, связанные со структурой
struct file
, — это знакомые системные вызовы, составляющие основу системных вызовов ОС Unix. Методы работы с файловым объектом хранятся в структуре
file_operations
и определены в файле <linux/fs.h>
следующим образом. struct file_operations {
struct module *owner;
loff_t (*llseek)(struct file*, loff_t, int);
ssize_t (*read)(struct file*, char*, size_t, loff_t*);
ssize_t (*aio_read)(struct kiocb*, char*, size_t, loff_t);
ssize_t (*write)(struct file*, const char*, size_t, loff_t*);
ssize_t (*aio_write)(struct kiocb*, const char*, size_t, loff_t);
int (*readdir)(struct file*, void*, filldir_t);
unsigned int (*poll)(struct file*, struct poll_table_struct*);
int (*ioctl)(struct inode*, struct file*, unsigned int, unsigned long);
int (*mmap)(struct file*, struct vm_area_struct*);
int (*open)(struct inode*, struct file*);
int (*flush)(struct file*);
int (*release)(struct inode*, struct file*);
int (*fsync)(struct file*, struct dentry*, int);
int (*aio_fsync)(struct kiocb*, int);
int (*fasync)(int, struct file*, int);
int (*lock)(struct file*, int, struct file_lock*);
ssize_t (*readv)(struct file*, const struct iovec*,
unsigned long, loff_t*);
ssize_t (*writev)(struct file*, const struct iovec*,
unsigned long, loff_t*);
ssize_t (*sendfile)(struct file*, loff_t*, size_t,
read_actor_t, void*);
ssize_t (*sendpage)(struct file*, struct page*, int,
size_t, loff_t*, int);
unsigned long (*get_unmapped_area)(struct file*, unsigned long,
unsigned long, unsigned long, unsigned long);
int (*check_flags)(int flags);
int (*dir_notify)(struct file *filp, unsigned long arg);
int (*flock)(struct file *filp, int cmd, struct file_lock *fl);
};
Файловые
NULL
. Рассмотрим каждую операцию подробнее.
•
loff_t llseek(struct file *file, loff_t offset, int origin);
Эта функция устанавливает значения указателя текущей позиции в файле (file pointer) в заданное значение параметра
offset
. Функция вызывается из системного вызова lseek
. •
ssize_t read(struct file *file,
char *buf, size_t count, loff_t* offset);
Эта функция считывает
count
байт данных из указанного файла, начиная с позиции, заданной параметром offset
, в буфер памяти, на который указывает параметр buf
. После этого значение указателя текущей позиции в файле должно быть обновлено. Данная функция вызывается из системного вызова read
.
Поделиться:
Популярные книги
Измена. Тайный наследник
1. Тайный наследник
Фантастика:
фэнтези
5.00
рейтинг книги
Инквизитор Тьмы
1. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Ротмистр Гордеев 3
3. Ротмистр Гордеев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
(Не)нужная жена дракона
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
Идеальный мир для Лекаря 28
28. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Сыночек в награду. Подари мне любовь
1. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Инквизитор Тьмы 2
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Генерал Скала и ученица
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Искатель 1
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Сердце Дракона. Том 10
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Печать мастера
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Выстрел на Большой Морской
4. Сыщик Его Величества
Детективы:
исторические детективы
полицейские детективы
8.64
рейтинг книги
Кодекс Крови. Книга VII
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00