ioctl读写接口中的文件描述符和loff_t偏移量

Posted

技术标签:

【中文标题】ioctl读写接口中的文件描述符和loff_t偏移量【英文标题】:file descriptor and loff_t offset in ioctl read and write interface 【发布时间】:2015-08-05 06:18:49 【问题描述】:

最近我正在编写有关内核驱动程序模块和用户空间应用程序之间通信的示例代码。 我对 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 是一个指向 “长偏移类型”对象,指示用户所在的文件位置 访问。

我想知道,为什么我们需要参数 loff_t *offp ?由于文件描述符中的元素: filp->f_pos 已经指示了当前的读写位置。 而且据我观察,在读或写返回后,系统会自动给filp->f_pos赋值offp

非常感谢!

【问题讨论】:

【参考方案1】:

这些接口也用于pread/pwrite 函数,它们使用自己的偏移量而不是共享一个filp->f_pos。这就是 offp 被显式传递给接口的原因。

【讨论】:

以上是关于ioctl读写接口中的文件描述符和loff_t偏移量的主要内容,如果未能解决你的问题,请参考以下文章

了解file_operations的loff_t * offp

帧缓冲字符设备接口

`ioctl` 读写 GPIO:无效参数

第三章文件的描述符和重定向

字符设备ioctl接口详解

使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector