Linux VFS:vfs_read(...,&offset)与vfs_llseek(...,pos):如何从内核模块中查找文件

时间:2019-06-23 06:20:48

标签: c file-io linux-kernel vfs

给予

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 个答案:

答案 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 (即由文件定义)。例如,如果文件将信息公开为记录数组,则位置可能表示记录的索引,而不是字节的索引。