|
在 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 表示定位到文件的末尾。 |
|