Chinaunix首页 | 论坛 | 博客
  • 博客访问: 531040
  • 博文数量: 81
  • 博客积分: 1438
  • 博客等级: 上尉
  • 技术积分: 866
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-12 11:32
文章分类

全部博文(81)

文章存档

2014年(1)

2013年(1)

2012年(33)

2011年(46)

分类: 嵌入式

2012-03-31 10:57:34

内核:2.6.24


使用数据区时,可以使用 lseek 来往上往下地定位数据。但像串口或键盘一类设备,使用的是数据流,所以定位这些设备没有意义;在这种情况下,不能简单地不声明 llseek 操作,因为默认方法是允许定位的。

在 open 方法中调用 nonseekable_open() 时,它会通知内核设备不支持 llseek,nonseekable_open() 函数的实现定义在 fs/open.c 中:


点击(此处)折叠或打开

  1. /* * This is used by subsystems that don't want seekable * file descriptors */
  2. int nonseekable_open(struct inode *inode, struct file *filp)
  3. {
  4.     filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
  5.     return 0;
  6. }



当该函数调用后,如果再使用 lseek 操作时,那么内核会进行检查(fs/read_write.c):

点击(此处)折叠或打开

  1. loff_t vfs_llseek(struct file *file, loff_t offset, int origin)
  2. {
  3.    loff_t (*fn)(struct file *, loff_t, int);
  4.    fn = no_llseek;
  5.    if (file->f_mode & FMODE_LSEEK) {
  6.       //检查是否可以
  7.       LSEEK fn = default_llseek;
  8.       if (file->f_op && file->f_op->llseek)
  9.       fn = file->f_op->llseek;
  10.    }
  11.    return fn(file, offset, origin);
  12. }


上面,no_llseek() 函数定义为:


点击(此处)折叠或打开

  1. loff_t no_llseek(struct file *file, loff_t offset, int origin)
  2. {
  3.    return -ESPIPE;
  4. }


为了完整起见,如果不希望设备被 seek,还应该将 file_operations 结构中的 llseek 方法设置为特殊的辅助函数 no_llseek 。
 
 
转自:
阅读(4003) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~