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

发布时间:2023年12月18日
对于所有打开的文件都有一个当前文件偏移量(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。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

(点击找小助理免费领取)扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

文章来源:https://blog.csdn.net/D_ovis/article/details/135052942
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。