我有几个文件要映射到具有mmap()个文件的虚拟地址空间consecutively中.每个文件长度都是页面大小的倍数.

对于第一个文件,我调用mmap(),将addr参数设置为nullptr.在下一次调用中,我将addr参数设置为第一个文件映射到的区域末尾之后的地址.

在某些情况下,我无法映射所有文件,因为mmap()忽略了addr提示.有没有办法预先预分配整个区域,然后将文件一次映射到一个区域?

推荐答案

我要感谢@GSPR在这个问题上的帮助!

要确保您可以成功处理所有文件,您必须执行以下操作:

  1. mmap()一个匿名区域,其大小等于文件大小之和.
void* ret = mmap(/*addr=*/nullptr, file_size_sum, PROT_NONE,
                 MAP_SHARED | MAP_ANONYMOUS, /*fd=*/-1, /*offset=*/0);
assert(ret != MAP_FAILED);
  1. 每个文件在预先分配的区域内一次一个.重要的是,使用MAP_FIXED旗帜.
void* addr = mmap(ret, file_size, PROT_READ,
                  MAP_SHARED | MAP_FIXED, fd, /*offset=*/0);
assert(addr != MAP_FAILED);

MAP_FIXED指示mmap()使用addr参数中指定的确切地址.如果已经存在addr的映射,则覆盖该映射.因此,重要的是,我们在步骤(1)中预先分配了整个区域,这样当我们使用MAP_FIXED时,就不会在步骤(2)中无意中覆盖其他内容的现有映射.

C++相关问答推荐

理解没有返回语句的递归C函数的行为

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

exit(EXIT_FAILURE):Tcl C API类似功能

在一个小型玩具项目中实现终端历史记录功能

#If指令中未定义宏?

Ruby C Api处理异常

正确的TCP/IP数据包 struct

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

如何在下面的C代码中正确管理内存?

如何使用C++在控制台中以彩色打印被阻止的客户端

使用TCL C API导航到列表中的元素

如何在VS 2022中正确安装额外的C头文件

Tic-tac-toe:从文件加载存储

如何打印循环调度问题的时间表

按字典顺序打印具有给定字符的所有可能字符串

在哪里可以找到叮当返回码的含义?

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

函数指针作为函数参数 - 应该使用 const 吗?

在 C 中传递参数时出现整数溢出