列出稀疏文件中的所有空洞和数据段

2024-04-04

我正在尝试实现一个程序,它可以使用以下命令打印常规稀疏文件中的所有孔和数据段lseek(2)及其论点SEEK_DATA and SEEK_HOLE,类似于:

$ ./list_hold_and_data_segs sparse_file
This file has 100 bytes
[0, 10]: hole
[11, 99]: data(end)

执行

/*
 * list_hole_and_data_segs.c
*/
#define _GNU_SOURCE

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

enum Type {
    HOLE,
    DATA,
};

void find_all_holes(int fd);

int main(int ac, char *av[])
{
    int fd = open(av[1], O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    find_all_holes(fd);
    return 0;
}

void find_all_holes(int fd)
{
    off_t cur_offset = 0; // current offset
    enum Type cur_type; // current byte type

    off_t file_size = lseek(fd, 0, SEEK_END);
    off_t index_of_last_byte = file_size - 1;

    printf("This file has %ld bytes\n", file_size);

    // check the type of byte 0
    off_t res = lseek(fd, 0, SEEK_HOLE);
    if (res == 0) {
        cur_type = HOLE;
    } else if (res == file_size) {
        printf("[0, %ld]: data(then exit)\n", index_of_last_byte);
        exit(0);
    } else {
        cur_type = DATA;
        cur_offset = res;
    }

    while (cur_offset <= index_of_last_byte) {
        off_t new_offset =lseek(fd, cur_offset,
                  ((cur_type == DATA) ? SEEK_HOLE : SEEK_DATA));
        if ((cur_type == HOLE && new_offset == -1 && errno == ENXIO) ||
            (cur_type == DATA && new_offset == file_size)) {
            // from current position to the end of this file: `cur_type`
            printf("[%ld, %ld]: %s(end)\n", cur_offset,
                   index_of_last_byte,
                   ((cur_type == DATA) ? "data" : "hole"));
            break; // exit of while loop
        } else {
            // from current offset to the new offset: `cur_type`
            printf("[%ld, %ld]: %s\n", cur_offset, new_offset - 1,
                   ((cur_type == DATA) ? "data" : "hole"));

            cur_offset = new_offset;
            cur_type = (cur_type == DATA) ? HOLE : DATA;
        }
    }
}

测试我的实现

我使用以下代码片段创建稀疏文件,为了简单起见,省略了错误处理:

/*
 * create_sparse_file.c
*/
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    int fd = open("sparse_file", O_CREAT | O_WRONLY | O_TRUNC, 0666);
    lseek(fd, 10000, SEEK_CUR);
    write(fd, "HELLO", 5);
    close(fd);
    return 0;
}
$ gcc create_sparse_file.c -o create_sparse_file && ./create_sparse_file

$ stat sparse_file
  File: sparse_file
  Size: 10005           Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 3556105     Links: 1

# create a normal file as a comparision
$ cp sparse_file not_sparse_file --sparse=never
$ stat not_sparse_file
  File: not_sparse_file
  Size: 10005           Blocks: 24         IO Block: 4096   regular file
Device: 803h/2051d      Inode: 3557867     Links: 1

$ gcc list_hole_and_data_segs.c -o list_hole_and_data_segs

$ ./list_hole_and_data_segs sparse_file
This file has 10005 bytes
[0, 8191]: hole
[8192, 10004]: data(end)

Question

正如你所看到的,输出./list_hole_and_data_seg sparse_file is:

[0, 8191]: hole
[8192, 10004]: data(end)

而真实的案例是:

[0, 9999]: hole
[10000, 10004]: data(end)

是什么使得行为list_hole_and_data_seg与实际情况不符,如何修正?

环境

$ uname -a
Linux pop-os 5.17.15-76051715-generic #202206141358~1655919116~22.04~1db9e34 SMP PREEMPT Wed Jun 22 19 x86_64 x86_64 x86_64 GNU/Linux

$ df -hT .
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sda3      ext4  103G   54G   44G  56% /

$ stat -f .
  File: "."
    ID: 4885eb446c106708 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 26819732   Free: 12805152   Available: 11431226
Inodes: Total: 6856704    Free: 6062138

$ gcc --version
gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0

$ ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3) 2.35

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列出稀疏文件中的所有空洞和数据段 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu

随机推荐

  • JSF 和 Facelets 文件的自动重新加载

    我在使用 JRebel Spring JSF Mojarra 2 0 3 和 WebLogic 10 3 热重载 Facelets 文件时遇到了一些问题 JRebel 成功重新加载 WebContent 下的常规 Java 类和 js cs
  • System.Diagnostics.Process.Start 奇怪的行为

    我正在用 C 编写一个应用程序来启动和监视其他应用程序 我使用 System Diagnostics Process 类启动应用程序 然后使用 Process Responding 属性每 100 毫秒轮询一次应用程序的状态来监视应用程序
  • 将双精度十进制转换为十六进制、二进制和八进制字符串

    是否有一个自定义或标准库可以与 Objective C 一起使用 将十进制浮点值转换为十六进制 二进制和八进制 NSString 我一直在四处寻找 但只能找到如何通过使用以下方法转换另一个方向 从其他方向转换为十进制 double resu
  • 数组排序不起作用

    我有一组对象正在尝试排序 但它似乎不起作用 数组中的某些对象具有orderNum我要排序的属性 但并不是所有的物体都具有这个属性 我想要带有以下内容的对象orderNum要排序到数组顶部位置的属性 这是我尝试过的小提琴 http jsfid
  • Android 材料设计复制工具栏面包屑示例

    我正在尝试复制面包屑示例 我已经将 TextView 添加到工具栏 但无法完全复制工具栏样式的字体 大小 颜色 并且无法让面包屑从屏幕左侧浮动 您将需要创建自己的面包屑视图并将其添加到工具栏中 也许基于现在已弃用的碎片面包屑 https d
  • React Native 的 panResponder 的 useState 的价值已经过时了吗?

    我需要读取的值useState in onPanResponderMove 页面加载时onPanResponderMove正确记录初始值0 但是当我点击之后TouchableOpacity增加foo the onPanResponderMo
  • 如何合并所有子目录中同名的文本文件?

    我有几个包含文件的文件夹 文件可以具有相同的名称 我想将文件连接到每个名称之一 提前致谢 EDIT 抱歉 您能给我看一下它的批处理文件吗 合并 bat echo off for every text file in the sub dirs
  • 是一个在给定上下文错误中无效的“方法”

    这是 Head First CSharp 第 113 页 的示例 我收到以下错误 错误 1 Guys Form1 joesCashLabel object System EventArgs 是一种 方法 在给定上下文中无效 c temp G
  • Instagram 的 GET/tags//media/recent 分页实际上是如何工作的?

    我正在尝试使用实时照片更新 http instagram com developer realtime 用于获取带有特定标签的所有图片的 API 因为此 API 的更新实际上只告诉您that新内容存在 但不存在 what是的 每当我收到某些
  • 同一命名空间中的包:无法在安装脚本中导入模块

    我很好奇下面的情况 假设我有两个名为project alpha and project bravo 都定义了顶级命名空间包mymeta 布局 project alpha gt mymeta gt init py gt project alp
  • NamedParameterJdbcTemplate - 从以下位置选择 *

    在 Spring 的 NamedParameterJdbcTemplate 中 如何使用 Spring 版本 3 1 x 执行 Select from Student 的查询以返回列表而不提供任何参数 根据http docs spring
  • C# ImageBox 在 MouseUp 上清除矩形

    我有一个面板 其中包含在运行时创建的多个图片框 用户将在任何图片框上创建一个矩形 所选部分将显示在预览图片框上 我已经使用下面的代码成功完成了上述操作 Question 我想在 mouseup 事件中清除选择矩形 使用无效但不起作用 从如何
  • Visual Studio 远程调试扩展性

    我正在尝试使用类似于以下的代码连接到远程计算机 Debugger2 db Debugger2 dte Debugger Transport trans db Transports Item Default Process2 proc2 Pr
  • 如何从源代码构建适用于 iOS 的 libssl.a?

    I have a project referenced to libSSL a in xcode 5 so I try to build it myself error message of make command is this 我做了
  • 如何将容器 div 及其所有内容缩放到特定大小?

    我创建了一个 100 浏览器 宽度的 HTML 页面 其中包含很多内容 内容在页面中是固定的 其大小均以像素和百分比为单位 现在我需要添加20 浏览器宽度的广告面板 并且想要将页面容器及其所有内容 包括文本 缩放至 80 就像所有网络浏览器
  • 在 Fluent NHibernate 中使用鉴别器

    我正在尝试创建一个鉴别器列 该列将保存许多可用状态之一 就像我的代码将显示的那样 每个状态都有一个名称和背景颜色 每个状态共享相同的基类 这是我的代码 public class Item public virtual int Id get
  • Oracle SQL 中时间戳转换为 EPOCH 时间

    我在表 22 03 2022 06 59 59 中输入日期作为列 我需要转换成 EPOCH 时间 预期输出 1647932399 时区 印度尼西亚雅加达 参考链接 https www epochconverter com https www
  • ElasticBeanstalk - 应用程序更改未显示

    我正在使用 Elasticbeanstalk 在 AWS 上托管一个应用程序 我正在使用工具带从本地计算机推送我的应用程序 直到几周前 一切都工作正常 但最近我的更改没有生效 我可以在 aws 管理控制台中看到我的应用程序正在推送和部署 但
  • bash 从这里运行脚本 doc [重复]

    这个问题在这里已经有答案了 在下面的代码中 变量X正常输出 cat a sh X world echo hello X cat a sh bash hello world 但是 使用here doc 变量X不会显示 cat lt
  • 列出稀疏文件中的所有空洞和数据段

    我正在尝试实现一个程序 它可以使用以下命令打印常规稀疏文件中的所有孔和数据段lseek 2 及其论点SEEK DATA and SEEK HOLE 类似于 list hold and data segs sparse file This f