lseek()

#include <sys/types.h>

#include <unistd.h>

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

lseek(fd,100,SEEK_CUR);

whence:

SEEK_SET:文件指针偏移的时候相对位置是文件开始

SEEK_CUR:文件指针偏移的时候相对位置是当前移动到的文件指针(就是指写入空格)

SEEK_END:文件指针偏移的时候相对位置是文件结束

offset:偏移量

off_t:*_t是整数的别名 typedef定义的数据类型


例子:

int main()

{

int fd=0;

fd=open("1.log",O_RDWR|O_CREAT|O_TRUNC,0644);

if(fd<0)

{

perror("open");

exit(0);

}

 

//写文件

char buf[32]={0};

strcpy(buf,"hello");

write(fd,buf,strlen(buf));


//移动文件指针

lseek(fd,100,SEEK_CUR);

strcpy(buf,"world");

write(fd,buf,strlen(buf));


//关闭文件

close(fd);

return 0;

}



### 使用 `lseek` 创建和处理空洞文件 在 Linux 系统编程中,`lseek` 函数可以用来移动文件指针的位置。当文件指针被移到一个尚未写入数据的地方时,就会形成所谓的“空洞”,即文件中存在未分配的数据区域。 #### lseek 基本语法 ```c #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); ``` 参数说明: - `fd`: 文件描述符。 - `offset`: 移动偏移量。 - `whence`: 定义起始位置的方式,可选值为 SEEK_SET (从头开始), SEEK_CUR (当前位置),SEEK_END (文件结尾)[^3]。 #### 创建空洞文件示例 下面是一个简单的 C 语言程序来展示如何利用 `lseek` 来创建具有空洞结构的文件: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main(void){ const char *filename = "sparsefile"; int fd; // 打开或创建新文件 fd = open(filename, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); if(fd == -1){ perror("open"); exit(EXIT_FAILURE); } // 将文件指针定位到第 10MB 的地方 if(lseek(fd, 10*1024*1024, SEEK_SET) == -1){ close(fd); perror("lseek"); exit(EXIT_FAILURE); } // 向该处写入一些字符 write(fd,"hello",5); // 关闭文件 close(fd); printf("Sparse file created successfully.\n"); return 0; } ``` 上述代码片段展示了怎样通过先调用 `lseek` 把文件指针跳转至远离当前开头的一个较大数值(这里是 10 MB),再执行一次小规模的写操作,在此之前所经过的大片空白就构成了这个文件里的“空洞”。 #### 验证空洞的存在 可以通过查看文件的实际大小与逻辑大小之间的差异来进行验证。使用命令行工具如 `du` 和 `ls -lh` 对比显示的结果能够直观看出这一点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值