不允许lseek文件 | nonseekable_open()
2012-12-08 21:16
204 查看
使用数据区时,可以使用 lseek 来往上往下地定位数据。但像串口或键盘一类设备,使用的是数据流,所以定位这些设备没有意义;在这种情况下,不能简单地不声明 llseek 操作,因为默认方法是允许定位的。
在 open 方法中调用 nonseekable_open() 时,它会通知内核设备不支持 llseek,nonseekable_open() 函数的实现定义在 fs/open.c 中:
当该函数调用后,如果再使用 lseek 操作时,那么内核会进行检查(fs/read_write.c):
上面,no_llseek() 函数定义为:
为了完整起见,如果不希望设备被 seek,还应该将 file_operations 结构中的 llseek 方法设置为特殊的辅助函数 no_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; }
当该函数调用后,如果再使用 lseek 操作时,那么内核会进行检查(fs/read_write.c):
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); }
上面,no_llseek() 函数定义为:
loff_t no_llseek(struct file *file, loff_t offset, int origin) { return -ESPIPE; }
为了完整起见,如果不希望设备被 seek,还应该将 file_operations 结构中的 llseek 方法设置为特殊的辅助函数 no_llseek 。
相关文章推荐
- 不允许lseek文件 | nonseekable_open()
- 不允许lseek文件 | nonseekable_open()
- 不允许lseek文件 | nonseekable_open()【转】
- 文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
- Linux 文件IO函数(open/close/read/write/lseek)
- 1.Linux应用编程---文件I/O(open、read、write、lseek、close)
- 文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
- Linux系统开发 2 文件IO open() close() read() write() perror() lseek() fcntl() ioctl()
- Linux文件I/O(creat/open/read/write/lseek/close/dup/sync)
- Linux基础编程-文件操作open,lseek,read,write,close
- Linux 文件操作 open,lseek,read,write,close
- Linux 文件IO — open、read、write 、lseek
- Linux基础编程-文件操作open,lseek,read,write,close
- linux文件操作open close read write lseek
- Linux 文件系统调用函数open close read write lseek perror
- 请尝试使用open、lseek等函数创建 一个含有空洞的文件
- 文件I/O编程 (open、read、write、lseek、close)
- Linux基础编程-文件操作open,lseek,read,write,close
- 嵌入式linux文件I/O编程 (open、read、write、lseek、close)
- 用O_APPEND标志open一个文件,能否用lseek在任意位置读写