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

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(使用前将#替换为@)

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

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 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