曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7391|回复: 0
打印 上一主题 下一主题

llseek 文件定位

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2010-10-13 23:38:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 lld3 中的 scull 中的 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;
}
函数的返回类型是 loff_t ,此类型被定义为 long long 型,在 32 位平台上,为 64 位:
#if defined(__GNUC__)
typedef __kernel_loff_t        loff_t;
#endif

typedef long long    __kernel_loff_t;
第 2 个参数 off 表示文件偏移。这个值就是 lseek() 函数中的第 2 个参数,即用户想要的偏移值。lseek() 函数的定义为:
off_t lseek(int fd, off_t offset, int whence);
设备文件如果已经被打开,则当前偏移位置由 filp->f_pos 来指出。

SEEK_SET 表示从文件头开始;
SEEK_CUR 表示从文件当前开始;
SEEK_END 表示定位到文件的末尾。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 00:29 , Processed in 0.082669 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表