文件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

目录
相关文章
|
前端开发 JavaScript
使用 MobX 优化 React 代码
使用 MobX 优化 React 代码
169 0
|
Java 应用服务中间件 Go
《Spring Boot框架原理》
《Spring Boot框架原理》
206 1
|
算法
【MATLAB】逐次变分模态分解SVMD信号分解算法
【MATLAB】逐次变分模态分解SVMD信号分解算法
939 0
|
NoSQL Java 数据库
【SpringBoot】简述springboot项目启动数据加载内存中的三种方法
SpringBoot提供了两个接口: CommandLineRunner 和 ApplicationRunner 。实现其中接口,就可以在工程启动时将数据库中的数据加载到内存。使用的场景有:加载配置项到内存中;启动时将字典或白名单数据加载到内存(或缓存到Redis中)。
906 0
|
存储 分布式计算 大数据
大数据之路:阿里巴巴大数据实践——大数据领域建模综述
数据建模解决数据冗余、资源浪费、一致性缺失及开发低效等核心问题,通过分层设计提升性能10~100倍,优化存储与计算成本,保障数据质量并提升开发效率。相比关系数据库,数据仓库采用维度建模与列式存储,支持高效分析。阿里巴巴采用Kimball模型与分层架构,实现OLAP场景下的高性能计算与实时离线一体化。
|
9月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
291 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
安全 网络协议 Ubuntu
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
【常见开源库的二次开发】HTTP之libcurl库——libcurl使用(二)
2576 2
|
数据安全/隐私保护
PGA调整峰值,IDA分析调整Sa(T,ξ)反应谱
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
Linux
【专栏】在 Linux 系统中,符号链接(Symbolic Link)是一种特殊的文件类型,它指向另一个文件或目录
【4月更文挑战第28天】在Linux中,符号链接是特殊的文件类型,指向其他文件或目录。本文介绍了查找符号链接的三种方法:1) 使用`ls -l`查看文件类型为'l'的项;2) 使用`find / -type l`遍历文件系统;3) 使用`lsof -L`列出打开的链接。此外,还讨论了命令的详细用法、高级技巧和应用场景,并提供了实际案例。注意权限、系统负载和目标文件存在性等问题。掌握这些命令有助于管理和维护系统符号链接。
781 0
|
安全 Java Go
探索Go语言在高并发场景中的优势
Go语言,作为一种现代编程语言,凭借其并发模型和高效的性能,正在成为处理高并发任务的首选。本文深入探讨Go语言的并发特性,特别是goroutines和channels如何在实际应用中提供高效的解决方案。我们将通过对比其他语言的处理方式,展示Go语言在性能和可维护性上的优势。