最近我正在研究有关内核驱动程序模块和用户空间应用程序之间通信的示例代码。 我对file_operations()中的.read和.write接口有疑问。 根据LDD3:
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);
对于这两种方法,
filp
是文件指针,count
是大小 请求的数据传输。buff
参数指向用户 缓冲区保存要写入的数据或空缓冲区所在的位置 应该放置新读取的数据。最后,offp
是指向a的指针 “long offset type”对象,指示用户所在的文件位置 存取。
我想知道,为什么我们需要参数loff_t *offp
?由于文件描述符中的元素:
filp->f_pos
已指示当前的读写位置。
根据我的观察,在读取或写入返回后,系统将自动给filp->f_pos
offp
的值。
非常感谢!
答案 0 :(得分:1)
这些接口也用于pread
/ pwrite
函数,它们使用自己的偏移量而不是共享的filp->f_pos
。这就是为什么offp
明确地传递给接口的原因。