lseek()函数的原型及使用方法,超详细
读写操作可以使文件的偏移量发生变化;而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。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
(点击找小助理免费领取)扫码进群领资料https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!