曲径通幽论坛

标题: llseek 文件定位 [打印本页]

作者: beyes    时间: 2010-10-13 23:38
标题: llseek 文件定位
在 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 表示定位到文件的末尾。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2