天天看点

linux驱动开发--字符设备:添加文件指针偏移的功能

设备移位操作llseek

对应lseek系统调用的设备移位操作为llseek

默认情况为允许设备移位操作

大部分字符设备提供的都是数据流而不是一个数据区,比如串口,对于这些设备而言移位操作毫无意义

设备可选择是否支持移位操作

支持设备移位操作

loff_t (*llseek)(struct file *filp, loff_t off, int whence);

filp:待操作的设备文件file结构体指针

off:待操作的定位偏移值(可正可负)

whence:待操作的定位起始位置

返回:返回移位后的新文件读、写位置,并且新位置总为正值

定位起始位置

  seek_set:0,表示文件开头

  seek_cur:1,表示当前位置

  seek_end:2,表示文件尾

支持设备移位操作函数

  完成设备移位操作函数

  应该检查用户请求的定位操作合法性,若不合法,应该返回-einval

  在读、写操作中完成读、写更新文件位置

  应该根据当前文件位置检查当前读、写操作合法性

设备移位操作函数

  定义新位置变量

  switch(whence)重新计算新位置

  判断如果新位置为负或超过缓冲区最大值返回-einval

  用新位置更新filp中的f_pos

  返回新位置

在读、写操作中完成读、写后更新文件位置

  定义实际可读、写字节数变量

  根据当前文件位置和缓冲区最大值判断新的实际可读、写字节数变量值

  根据实际可读、写字节数变量读、写数据

  根据实际可读、写字节数变量更新文件位置

  返回实际可读、写字节数变量值

继续阅读