5.llseeek实现
llseek方法对应lseek和llseek系统调用,该方法通过直接修改filp->f_pos执行定位操作,filp->f_pos记录的文件的读写位置,为了让lseek系统调用正确工作,read/write方法必须通过更新它们收到的偏移量参数来配合。在scull设备中的该方法实现如下:
- /*
- * The "extended" operations -- only seek
- */
- 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;
- }
6.设备文件访问控制
提供设备文件的控制访问有时候是很重要的,书中提到了几种有关设备控制访问的方法,下面简单介绍下:
1.独享设备:一次只允许一个进程打开设备。
2.限制每次只由一个用户访问:允许单个用户在多个进程中打开设备。
3.阻塞型open操作:如果打开文件失败,阻塞该进程知道满足条件。
4.打开时复制设备:在进程打开文件时创建设备的不同私有副本,这种方法只有在设备没有绑定到某个硬件对象时才能实现。
阅读(2370) | 评论(0) | 转发(0) |