第六章:高级字符驱动程序操作(续4)
以下为第五部分:定位设备
这部分相当简单,需要注意的是即使大多数设备进行定位操作没有意义,但是也不能步声明llseek操作,因为默认是允许定位的。而是应该在open中调用nonseekable_open,这样内核就不会让lseek调用成功。
下面是scull驱动的main.c中的llseek实现。
以下为第五部分:定位设备
这部分相当简单,需要注意的是即使大多数设备进行定位操作没有意义,但是也不能步声明llseek操作,因为默认是允许定位的。而是应该在open中调用nonseekable_open,这样内核就不会让lseek调用成功。
下面是scull驱动的main.c中的llseek实现。
- 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;
- }