Chinaunix首页 | 论坛 | 博客
  • 博客访问: 312726
  • 博文数量: 169
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 12
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-10 12:00
文章分类

全部博文(169)

文章存档

2014年(38)

2013年(131)

我的朋友

分类: 嵌入式

2013-07-10 13:47:13

llseek 方法实现了 lseek llseek 系统调用. 我们已经说了如果 llseek 方法从设备的操作中缺失, 内核中的缺省的实现进行移位通过修改 filp->f_pos, 这是文件中的当前读写位置. 请注意对于 lseek 系统调用要正确工作, 读和写方法必须配合, 通过使用和更新它们收到的作为的参数的 offset .

你可能需要提供你自己的方法, 如果移位操作对应一个在设备上的物理操作. 一个简单的例子可在 scull 驱动中找到:

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;

}

唯一设备特定的操作是从设备中获取文件长度. scull read write 方法如需要地一样协作.

尽管刚刚展示的这个实现对 scull 有意义, 它处理一个被很好定义了的数据区, 大部分设备提供了一个数据流而不是一个数据区(想想串口或者键盘), 并且移位这些设备没有意义. 如果这就是你的设备的情况, 你不能只制止声明 llseek 操作, 因为缺省的方法允许移位. 相反, 你应当通知内核你的设备不支持 llseek , 通过调用 nonseekable_open 在你的 open 方法中.

int nonseekable_open(struct inode *inode; struct file *filp);

这个调用标识了给定的 filp 为不可移位的; 内核从不允许一个 lseek 调用在这样一个文件上成功. 通过用这样的方式标识这个文件, 你可确定不会有通过 pread pwrite 系统调用的方式来试图移位这个文件.

 

阅读(736) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~