四时宝库

程序员的知识宝库

lseek()函数的原型及使用方法,超详细

对于所有打开的文件都有一个当前文件偏移量(current file offset),文件偏移量通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于当前文件偏移量的位置,并且使其增大,增量为读写的字节数。文件被打开时,文件的偏移量会被初始化为 0,除非使用了O_APPEND 。

读写操作可以使文件的偏移量发生变化;而lseek 函数也可以改变文件的当前位置。下面我们一块来看一下关于lseek函数的原型及使用方法。

通过man手册查看到lseek函数原型如下:需要的头文件为

#include

#include

off_t lseek(int fd, off_t offset, int whence);

参数:fd:文件描述符

offset:文件偏移量

whence:文件偏移相对位置

返回值:成功:返回文件新的偏移量(成功)

失败:-1(失败)

参数 offset可正可负,负数时向文件开头偏移,正数相对于文件末尾偏移

参数 offset 的含义取决于参数 whence:

1. 如果 whence 是 SEEK_SET,offset相对于文件开头进行偏移

2. 如果 whence 是 SEEK_CUR,offset相对文件当前位置进行偏移

3. 如果 whence 是 SEEK_END,offset相对于文件末尾进行偏移

对于whence参数的选项SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在这之前使用的是 0、1 和 2。

lseek 的以下用法返回当前的偏移量:

off_t currpos;

currpos = lseek(fd, 0, SEEK_CUR);

这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为ESPIPE。

对于普通文件(regular file),文件偏移量是一个非负整数。但对于特殊设备,文件偏移量有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。

lseek 仅将文件偏移位置保存于内核中,不会导致任何 I/O 操作。

如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。

以下程序创建一个有空洞的文件:

#include

#include

#include

#include

char buf1[] = "abcdefghij";

char buf2[] = "ABCDEFGHIJ";

int main(void)

{

int fd, size;

if ((fd = open("file.hole", O_RDONLY|O_CREATO_TRUNC, 0666)) < 0)

{

printf("open error\n");

return -1;

}

size = sizeof (buf1) - 1;

if (write(fd, buf1, size) != size)

{

printf("buf1 write error\n");

return -1;

}

/* offset now = 10 */

if (lseek(fd, 16384, SEEK_SET) == -1)

{

printf("lseek error\n");

return -1;

}

/* offset now = 16384 */

size = sizeof buf2 - 1;

if (write(fd, buf2, size) != size)

{

printf("buf2 write error\n");

return -1;

}

/* offset now = 16394 */

return 0;

}

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。


扫码进群领资料

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接