使用loff_t * offp而不是直接使用filp-> f_pos的原因

时间:2014-05-06 17:27:59

标签: c linux-kernel linux-device-driver read-write

以下函数取自LDD:

ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp);
ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp);

为什么需要loff_t *offp?我无法直接filp更新f_pos

此外,在第54页,作者说:

  

读取和写入应使用它们接收的指针作为最后一个参数更新位置,而不是直接作用于filp->f_pos。这个例外......

好的,所以最好使用offp指针,但为什么呢?

2 个答案:

答案 0 :(得分:2)

filp->f_pos是文件中的当前指针位置,而offp是用户访问文件的位置。在成功读/写操作时提前文件指针,如果失败,则不应更改文件指针。内核会自行完成,如果您成功读取/写入,它会将filp->f_pos更改为offp。引用LDD3:

  

无论方法传输的数据量是多少,它们都应该   通常更新* offp处的文件位置以表示当前   成功完成系统调用后的文件位置。该   然后内核将文件位置更改传播回文件   适当的结构。

答案 1 :(得分:0)

一个原因可能是支持pread,pwrite,preadv,pwritev系统调用,它们将偏移量作为参数之一,并指定为不更新文件位置。让低层代码实现接近p *函数的东西似乎更清晰,然后让包装器使用filp-> f_pos并更新普通读/写/ readv / writev系统调用的位置。