设备移位操作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
返回新位置
在读、写操作中完成读、写后更新文件位置
定义实际可读、写字节数变量
根据当前文件位置和缓冲区最大值判断新的实际可读、写字节数变量值
根据实际可读、写字节数变量读、写数据
根据实际可读、写字节数变量更新文件位置
返回实际可读、写字节数变量值