在 C 中使用 mmap 读取二进制文件时出现段错误

2024-03-23

我正在尝试在 C 中使用 mmap 只是为了看看它到底是如何工作的。目前我尝试使用 mmap 逐字节读取二进制文件。我的代码是这样的:

#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>    

int main(int argc, char *argv[]) {
    int fd;
    char *data;

    for ( int i = 1; i<argc; i++)
    {

        if(strcmp(argv[i],"-i")==0)
            fd = open(argv[i+1],O_RDONLY);
    }

    data = mmap(NULL, 4000, PROT_READ, MAP_SHARED, fd, 8000);
    int i = 0;
    notation = data [i];
    // ......

}

当我尝试 notation = data[0] 并收到 segfault 时,就会出现问题。我确信二进制文件中的第一个字节也是一个字符。我的 for 循环检查编译时是否有 -i 标志,如果有,下一个参数应该是文件名。


mmap 似乎失败,因为偏移量不是页面大小的倍数。您可以使用 perror 对此进行测试,并发现问题是无效的参数。如果你写:

data = mmap(NULL, 4000, PROT_READ, MAP_SHARED, fd, 8000);
perror("Error");

至少在我的 OS X 上会打印以下错误:

错误:参数无效

将偏移量从 8000 更改为 4096 或 8192 即可。 6144 没有,因此在此平台上它必须是 4096 的倍数。顺便,

printf("%d\n",getpagesize());

打印 4096。您应该将 mmap 的偏移量向下舍入到最接近的倍数,并在访问该区域时将余数添加到 i 中。当然,从该函数获取特定平台的页面大小。它可能在您已经声明的 unistd.h 中定义。

下面介绍如何正确处理偏移以及处理可能出现的错误。它打印位置 8000 处的字节:

int offset = 8000;
int pageoffset = offset % getpagesize();

data = mmap(NULL, 4000 + pageoffset, PROT_READ, MAP_SHARED, fd, offset - pageoffset);
if ( data == MAP_FAILED ) {
    perror ( "mmap" );
    exit ( EXIT_FAILURE );
}
i = 0;
printf("%c\n",data [i + pageoffset]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 中使用 mmap 读取二进制文件时出现段错误 的相关文章

  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 获取 std::variant 当前持有的 typeid(如 boost::variant type())

    我已经从 boost variant 迁移到 std variant 但遇到了障碍 我在 boost type 中使用了一个很好的函数 它可以让你获取当前持有的 typeid 看https www boost org doc libs 1
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • “int i=1,2,3”和“int i=(1,2,3)”之间的区别 - 使用逗号运算符的变量声明[重复]

    这个问题在这里已经有答案了 int i 1 2 3 int i 1 2 3 int i i 1 2 3 这些说法有什么区别 我无法找出任何具体原因 Statement 1 Result Compile error 运算符的优先级高于 运算符
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul

随机推荐

  • 使用curl NuGet无法解析的外部符号

    环境 微软视觉工作室 2017NuGet 包管理器C 项目 工作流程 我使用 NuGet 添加了curl 我尝试编译我的项目 它抛出 8 个链接器错误 无法解析的外部符号 项目结构 root gt packages gt curl 7 30
  • for循环中的setTimeout不打印连续值[重复]

    这个问题在这里已经有答案了 我有这个脚本 for var i 1 i lt 2 i setTimeout function alert i 100 But 3两次都会收到警报 而不是1 then 2 有没有办法通过i 而不将函数写为字符串
  • repo 同步命令的替代方案是什么?

    我是 git 新手 我想在完成后手动执行清单文件repo init 而不是做repo sync 测量正常 git 命令和repo sync在不同的情况下 但我不确定 repo 使用哪个 git 命令 我知道repo只是大型代码库的 git
  • 寻找返回黑盒模型最大输出的最佳输入组合

    在我的工作中将人工神经网络应用于回归任务时 我面临的挑战之一是 为了找到给定输入范围的最佳结果 我必须将多维网格输入到我的模型中 然后简单地选择最高的价值 然而 这总体上是一个计算成本非常高的解决方案 下面的文字长度可能会令人恐惧 但这只是
  • 在数据框或向量中查找非数字数据

    我读了一些冗长的数据read csv 令我惊讶的是 数据是以因子而不是数字的形式出现的 所以我猜测数据中必须至少有一个非数字项 我怎样才能找到这些物品的位置 例如 如果我有以下数据框 df lt data frame c 1 2 3 4 f
  • Django 在 save() 中获取对象的 ID

    我有一些固定的数字 可以说是num 1000现在我的字段需要是 object id 和 num 的总和 我需要在 save 中使用它 如下所示 def save self args kwargs num 1000 self special
  • 将单个数组分成两个数组的代码是怎样的?

    当我使用所需 URL 的 JSON 解析时 我在 nsarray 中得到以下响应 但在这里我不喜欢得到 2 1 4 4 6 5 8 7 10 9 12 和 11在单个数组中 我必须获得两个数组的总响应 我的意思是一个数组集将包含 2 4 6
  • 如何从Javascript数组中删除“[”和“]”符号

    我在用着react js用于构建我的仪表板 我想转换这样的数组 旧版本 进入这个 新版本 in javascript 所以我可以将新版本的数组放入 JSON 数组中 如下所示 newArray 我认识一个map函数返回一个数组 我知道这是一
  • 无法在 git bash 中使用命令 telnet

    我尝试使用命令telnet在 Git Bash 中 但它显示此错误 bash telnet 未找到命令 我的操作系统是 Windows 10 如有任何想法 我们将不胜感激 那是因为 git 没有提供 telnet 在 Windows 中 您
  • 我可以用一份许可证在两台机器上安装 VS 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是一名兼职教授 教授数据库和编程课程 我拥有一台运行 Windows 的台式机和笔记本电脑 我拥有 VS 2010 的学术版 并在家中安
  • Apollo 客户端从缓存中删除 Item

    我正在使用带有 React 的 Apollo 客户端 我用许多不同的变量查询帖子 所以我在不同的 缓存 中有一篇文章 现在我想删除一个帖子 所以我需要从所有 缓存 中删除这个特定的帖子 const client new ApolloClie
  • 如何在Xcode编译中集成.proto文件?

    我正在尝试将 Android 应用程序移植到 ios 和 mac xcode 生态系统 我的应用程序使用 Google proto buffs 并使用说明https github com alexeyxo protobuf swift bl
  • 使用 Intellij 在远程服务器上部署/调试 Java 代码

    我想在远程服务器上运行我的java代码以获得更快的速度 该服务器非常强大 我想要的是将我的 Intellij 连接到该远程服务器并运行我的代码 但我仍然想在我的本地计算机 即我的笔记本电脑 上使用 IntelliJ 我在 IntelliJ
  • jQuery 的 space 和 > 选择器有什么区别?

    两者有什么区别space http docs jquery com Selectors descendant ancestordescendant and gt http docs jquery com Selectors child选择器
  • 如何通过文件将参数传递给tortoiseproc.exe?

    我正在使用 java 中的 Runtime getRuntime exec 以编程方式生成要提交到 cmd exe 的命令 该命令是tortoiseproc忽略形式的命令 tortoiseproc command ignore path f
  • 在 Python 3 中创建抽象属性会导致 AttributeError

    如何在 python 中创建抽象属性 import abc class MyClass abc ABC abc abstractmethod property def foo self pass 结果出现错误AttributeError a
  • 如何将 PostgreSQL 数据库迁移到 SQLServer 数据库?

    我有一个 PostgreSQL 数据库 我想将其迁移到 SQL Server 架构和数据 我很穷 所以我不想付任何钱 我也很懒 所以不想做太多工作 目前我正在逐个桌子做这个 大约有100个桌子要做 这是极其乏味的 有什么技巧可以达到我想要的
  • JavaScript 支持的网站的自动导航

    我需要在 Python 中自动导航 JavaScript 支持的网站 以便我可以抓取一些内容 我碰到鸡足 http groups csail mit edu uid chickenfoot quickstart html 这是一个 Fire
  • 使用 CakePHP 分页助手进行引导分页

    我正在尝试让 CakePHP 的分页助手与 bootstrap 很好地配合 也就是说 我希望我的分页元素看起来像 bootstrap 的 但由 CakePHP 生成 目前我的视图页面上有这个 它产生以下标记 div class pagina
  • 在 C 中使用 mmap 读取二进制文件时出现段错误

    我正在尝试在 C 中使用 mmap 只是为了看看它到底是如何工作的 目前我尝试使用 mmap 逐字节读取二进制文件 我的代码是这样的 include