文件lseek操作产生空洞文件的方法

简介: 文件lseek操作产生空洞文件的方法

在文件操作过程中,lseek操作可以偏移到文件的任意位置。


在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。


如果 offset 比文件的当前长度更大,下一个写操作就会把文件撑大(extend)。这就是所谓的在文件里创造空洞(hole)。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。


空洞文件作用很大,例如迅雷下载文件,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。


接下来我们来实现一个案例,即创建一个1GB大小的空洞文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
    int fd;
    off_t offset;
    //创建一个权限为可读可写可执行的文件"tmp"
    fd = creat("tmp", 0777);
    if(-1 == fd)   //如果出错返回-1
    {
  perror("creat");
  return -1;
    }
    //设置偏移的大小为1024ll*1024ll*1024ll,并偏移到文件尾部
    offset = lseek(fd, 1024ll * 1024ll * 1024ll, SEEK_END);
    printf("offset = %d\n", offset);
    //写空,写1个字节到文件描述符里
    write(fd, "", 1);
    //关闭文件描述符
    close(fd);
    return 0;
}

运行结果:

640.png

640.png

目录
相关文章
|
8月前
|
算法 Linux C语言
【Linux系统编程】深入理解Linux目录操作:文件夹位置指针操作函数(telldir,seekdir,rewinddir)
【Linux系统编程】深入理解Linux目录操作:文件夹位置指针操作函数(telldir,seekdir,rewinddir)
104 0
|
8月前
|
存储 文件存储
<文件操作> 文件的打开与关闭,顺序读写,随机读写,二进制文件,读取结束的判定,文件缓冲区
<文件操作> 文件的打开与关闭,顺序读写,随机读写,二进制文件,读取结束的判定,文件缓冲区
53 1
|
8月前
|
存储 算法 数据处理
常用拷贝和替换算法-copy讲解
常用拷贝和替换算法-copy讲解
92 1
|
存储 安全 Linux
【看表情包学Linux】磁盘基础知识 | CHS 寻址 | 逻辑扇区 LBA | 索引节点 inode | 伪删除 inode bitmap 1→0
【看表情包学Linux】磁盘基础知识 | CHS 寻址 | 逻辑扇区 LBA | 索引节点 inode | 伪删除 inode bitmap 1→0
204 0
|
机器学习/深度学习 C语言
【C 语言】文件操作 ( 使用 fseek 函数生成指定大小文件 | 偏移量 文件字节数 - 1 )
【C 语言】文件操作 ( 使用 fseek 函数生成指定大小文件 | 偏移量 文件字节数 - 1 )
521 0
【C 语言】文件操作 ( 使用 fseek 函数生成指定大小文件 | 偏移量 文件字节数 - 1 )
【文件指针+文件顺序读写操作函数】(2)
1.文件的打开和关闭 1.1 什么是文件指针? 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统 声明的,取名FILE. 假如:我们要操作一个文件,名为text.txt ,首先要打开文件,打开文件的同时,操作系统会自动为该文件创建一个文件信息区,专门用来记录该文件的信息。
【文件指针+文件顺序读写操作函数】(1)
1.文件的打开和关闭 1.1 什么是文件指针? 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统 声明的,取名FILE.
|
编译器 C++ iOS开发
C++文件操作解析及使用(读、写文件 使用文件指针)
C++文件操作解析及使用(读、写文件 使用文件指针)
288 0
C++文件操作解析及使用(读、写文件 使用文件指针)
读取文件结束的判定的概念,使用方法和文件缓冲区的位置
读取文件结束的判定的概念,使用方法和文件缓冲区的位置
144 0

热门文章

最新文章