Linux中的lseek
2020-02-01 本文已影响0人
brownfeng
Linux中的lseek
lseek
函数用来重新定位文件的读写位置.
我们在linux编程中使用的文件描述符int fd, 在系统层会创建一个结构体,底层维护fd对应打开文件(linux中一切皆文件)的相关属性,其中一个非常关键的是文件读写位置offset.
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
offset
为正则向文件末尾移动(向前移),为负数则向文件头部(向后移)。
lseek()
函数会重新定位被打开文件的位移量,根据参数offset
以及whence
的组合来决定:
SEEK_SET
:
从文件头部开始偏移offset个字节
SEEK_CUR
:
从文件当前读写的指针位置开始,增加offset个字节的偏移量
SEEK_END
:
文件偏移量设置为文件的大小加上偏移量字节.
lseek
常见两个作用:
- 在
read
和write
函数掉过过程中,移动cur pos
位置 - 直接将fd背后的
cur pos
移动到文件末尾,lseek
返回的是文件的长度.
实例:
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("./a.out filename\n");
return -1;
}
int fd = open(argv[1], O_RDWR | O_CREAT, 0666);
/// file offset changed!!!
write(fd, "helloworld", 10);
char buf[256] = {0};
/// reset fd pos
lseek(fd,0, SEEK_SET);
int ret = read(fd, buf, sizeof(buf));
if (ret) {
write(STDOUT_FILENO, buf, ret);
}
close(fd);
return 0;
}