原型使用方法函数lseek(文件偏移偏移量参数函数)

对于所有打开的文件都有一个当前文件偏移量(current file offset),文件偏移量通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。
读写操作通常开始于当前文件偏移量的位置,并且使其增大,增量为读写的字节数。
文件被打开时,文件的偏移量会被初始化为 0,除非使用了O_APPEND 。
读写操作可以使文件的偏移量发生变化;而lseek 函数也可以改变文件的当前位置。
下面我们一块来看一下关于lseek函数的原型及使用方法。
通过man手册查看到lseek函数原型如下:需要的头文件为#include#includeoff_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#includechar 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。
里面学习内容、面经、项目都比较新也比较全。

某鱼上买估计至少要好几十。
扫码进群领资料
原型使用方法函数lseek(文件偏移偏移量参数函数)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息