<linux/fs.h>
loff_t (*llseek) (struct file *, loff_t, int);
llseek方法实现了lseek和llseek接口方法
如果没定义这个方法的话默认修改filp->f_pos(当前读写位置)
如果定位操作对应物理操作则必须实现llseek方法
例子:
loff_t (*llseek) (struct file x, loff_t off , int y)
{
struct scull_dev *dev = filp->private_data;
loff_t newpos;
switch(y)
{
case 0://SEEK_SET
newpos = off;
break;
case 1://SEEK_CUR
newpos = file->f_pos + off;
beak;
case 2://SEEK_END
newpos = dev->size + off;
break;
default://不存在
return -EINVAL;
}
if(newpos<0) return -EINVAL;
file->f_POS = newpos;
return newpos;
}
}
<linux/fs.h>
流设备中应该在open内调用nonseekable_open,通知设备不支持llseek
int nonseekable_open(struct inode *inode, struct file *filp)
llseek方法定义为函数no_llseek
loff_t no_llseek(struct file *file, loff_t offset, int origin)
独享设备
设备维护一个atomic_t变量 称为scull_s_available初始化1表明可用
open调用后减小并测试scull_s_available,在其他设备打开时拒绝
1.测试变量
2.打开设备减小变量
在release调用释放锁定
单用户独享设备通过上面类似方法绑定UID 绑定时需要spin_lock
内核链表static LIST_HEAD(xxx);