转自:
使用数据区时,可以使用 lseek 来往上往下地定位数据。但像串口或键盘一类设备,使用的是数据流,所以定位这些设备没有意义;在这种情况下,不能简单地不声明 llseek 操作,因为默认方法是允许定位的。
在 open 方法中调用 nonseekable_open() 时,它会通知内核设备不支持 llseek,nonseekable_open() 函数的实现定义在 fs/open.c 中:- /*
- * This is used by subsystems that don't want seekable
- * file descriptors
- */
- int nonseekable_open(struct inode *inode, struct file *filp)
- {
- filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
- return 0;
- }
-
- loff_t vfs_llseek(struct file *file, loff_t offset, int origin)
- {
- loff_t (*fn)(struct file *, loff_t, int);
-
-
- fn = no_llseek;
- if (file->f_mode & FMODE_LSEEK) { //检查是否可以 LSEEK
- fn = default_llseek;
- if (file->f_op && file->f_op->llseek)
- fn = file->f_op->llseek;
- }
- return fn(file, offset, origin);
- }
-
- loff_t no_llseek(struct file *file, loff_t offset, int origin)
- {
- return -ESPIPE;
- }
-