linux llseek 实现

linux llseek 实现,第1张

概述llseek 方法实现了 lseek 和 llseek 系统调用. 我们已经说了如果 llseek 方法从设备 的 *** 作中缺失, 内核中的缺省的实现进行移位通过修改 filp->f_pos, 这是文件中的当前 读写位置. 请注意对于 lseek 系统调用要正确工作, 读和写方法必须配合, 通过使用和 更新它们收到的作为的参数的 offset 项.   你可能需要提供你自己的方法, 如果移位 *** 作对应一

llseek 方法实现了 lseek 和 llseek 系统调用. 我们已经说了如果 llseek 方法从设备 的 *** 作中缺失,内核中的缺省的实现进行移位通过修改 filp->f_pos,这是文件中的当前 读写位置. 请注意对于 lseek 系统调用要正确工作,读和写方法必须配合,通过使用和 更新它们收到的作为的参数的 offset 项.

 

你可能需要提供你自己的方法,如果移位 *** 作对应一个在设备上的物理 *** 作. 一个简单的 例子可在 scull 驱动中找到:

 

loff_t scull_llseek(struct file *filp,loff_t off,int whence)

{

struct scull_dev *dev = filp->private_data; loff_t newpos;

 

switch(whence)

{

case 0: /* SEEK_SET */

newpos = off; break;

 

case 1: /* SEEK_CUR */

newpos = filp->f_pos + off; break;

 

case 2: /* SEEK_END */

newpos = dev->size + off; break;

 

default: /* can‘t happen */ return -EINVAL;

}

if (newpos < 0)

return -EINVAL; filp->f_pos = newpos; return newpos;

}

 

唯一设备特定的 *** 作是从设备中获取文件长度. 在 scull 中 read 和 write 方法如需要 地一样协作,如同在第 3 章所示.

 

尽管刚刚展示的这个实现对 scull 有意义,它处理一个被很好定义了的数据区,大部分 设备提供了一个数据流而不是一个数据区(想想串口或者键盘),并且移位这些设备没有意 义. 如果这就是你的设备的情况,你不能只制止声明 llseek *** 作,因为缺省的方法允许 移位. 相反,你应当通知内核你的设备不支持 llseek,通过调用 nonseekable_open 在 你的 open 方法中.

 

int nonseekable_open(struct inode *inode; struct file *filp);

 

这个调用标识了给定的 filp 为不可移位的; 内核从不允许一个 lseek 调用在这样一个 文件上成功. 通过用这样的方式标识这个文件,你可确定不会有通过 pread 和 pwrite 系统调用的方式来试图移位这个文件.

 

完整起见,你也应该在你的 file_operations 结构中设置 llseek 方法到一个特殊的帮 忙函数 no_llseek,它定义在 <linux/fs.h>.

总结

以上是内存溢出为你收集整理的linux llseek 实现全部内容,希望文章能够帮你解决linux llseek 实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1019064.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存