以下函数取自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
指针,但为什么呢?
答案 0 :(得分:2)
filp->f_pos
是文件中的当前指针位置,而offp
是用户访问文件的位置。在成功读/写操作时提前文件指针,如果失败,则不应更改文件指针。内核会自行完成,如果您成功读取/写入,它会将filp->f_pos
更改为offp
。引用LDD3:
无论方法传输的数据量是多少,它们都应该 通常更新* offp处的文件位置以表示当前 成功完成系统调用后的文件位置。该 然后内核将文件位置更改传播回文件 适当的结构。
答案 1 :(得分:0)
一个原因可能是支持pread,pwrite,preadv,pwritev系统调用,它们将偏移量作为参数之一,并指定为不更新文件位置。让低层代码实现接近p *函数的东西似乎更清晰,然后让包装器使用filp-> f_pos并更新普通读/写/ readv / writev系统调用的位置。