Как на самом деле искать файл с использованием 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
, значение позиции может быть любым (то есть это определяется файлом).Например, если файл предоставляет информацию в виде массива записей, позиция может означать индекс записи, а не индекс байта.