Linux设备驱动程序第三版学习(9)- 高级字符驱动程序操作(续4) - llseek定位设备

第六章:高级字符驱动程序操作(续4)
以下为第五部分:定位设备

这部分相当简单,需要注意的是即使大多数设备进行定位操作没有意义,但是也不能步声明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; }

你可能感兴趣的:(Linux设备驱动程序第三版学习(9)- 高级字符驱动程序操作(续4) - llseek定位设备)