VFS в Linux: vfs_read (..., & offset) против vfs_llseek (..., pos): как искать файл из модуля ядра - PullRequest
0 голосов
/ 23 июня 2019

GIVEN :

в fs/read_write.c функция vfs_read() имеет подпись, как показано ниже:

 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)

, где последний аргумент является указателем напозиция.Сама подпись не документирована.Я думаю, что подпись указывает на то, что начальная позиция чтения передается в функцию чтения, и, возможно, обновленная позиция (следующая позиция для чтения) записывается в *pos.Затем, однако, есть функция vfs_llseek() в fs/read_write.c с сигнатурой

loff_t vfs_llseek(struct file *file, loff_t offset, int whence)                                                                              

, которая выглядит как «нормальная» функция поиска.Кроме того, подпись не документируется вместе с кодом.

ВОПРОСЫ :

  1. Как в действительности выполнять поиск в файле с использованием VFS?
  2. Позиция равнак индексу байта в файле, то есть позиция первого байта = 0, позиция = позиция + 1 для последующих байтов?

1 Ответ

2 голосов
/ 23 июня 2019

Как на самом деле искать файл с использованием VFS?

Использование vfs_llseek правильно для этой цели.

VFS фактически имеет представление о текущая позиция файла , которая хранится в поле file->f_pos.Успешный вызов vfs_llseek обновляет эту позицию.Но для использования этой позиции при чтении файла вам нужно явно передать значение поля через pos параметр vfs_read и, при успешном возврате, записать полученное значение этого параметра обратно в поле:

loff_t pos = file->f_pos;
ssize_t res = vfs_read(file, buf, count, &pos);
if (res > 0) {
  file->f_pos = pos;
}

Существующая подпись vfs_read позволяет использовать эту функцию как в обычном системном вызове read, так и в системном вызове pread, который использует заданную пользователем позицию вместо текущей.

Позиция равна индексу байта в файле, то есть позиция первого байта = 0, позиция = позиция + 1 для последующих байтов?

Это верно для обычный файлы, которые хранятся на жестком диске или другом носителе.

Для специальных файлов, таких как файлы, расположенные под /sys или /dev, значение позиции может быть любым (то есть это определяется файлом).Например, если файл предоставляет информацию в виде массива записей, позиция может означать индекс записи, а не индекс байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...