给予:
在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)
看起来像一个“正常”搜索功能。另外,签名未随代码一起记录。
问题:
答案 0 :(得分:2)
一个人如何真正使用VFS搜索文件?
为此目的,正确使用vfs_llseek
。
VFS实际上有一个关于当前文件位置的概念,该概念存储在file->f_pos
字段中。成功致电vfs_llseek
会更新此职位。但是要在读取文件时使用此位置,您需要通过pos
的{{1}}参数显式传递字段的值,并在成功返回后将该参数的结果值写回该字段:
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
系统调用中使用此功能,后者使用用户指定的位置而不是当前位置。
位置是否等于文件中字节的索引,即第一个字节的位置= 0,后续字节的位置=位置+1?
对于存储在硬盘驱动器或其他介质上的常规文件,这是正确的。
对于特殊文件,例如位于pread
或/sys
下的文件,位置的含义可以是 any (即由文件定义)。例如,如果文件将信息公开为记录数组,则位置可能表示记录的索引,而不是字节的索引。