在达尔文真的没有mmap?

Joe*_*Joe 15 c macos mmap libc memory-mapped-files

我试图找出如何在Mac上重新映射内存映射文件(当我想扩展可用空间时).

我在Linux世界中看到了我们的朋友,mremap但我在Mac上的标题中找不到这样的功能./Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h有以下内容:

  • mmap
  • mprotect
  • msync
  • munlock
  • munmap
  • 但不是 mremap

man mremap 证实了我的恐惧.

我目前不得不munmap,mmmap如果我想调整映射文件的大小,这涉及使所有加载的页面无效.肯定有更好的办法.一定?

我正在尝试编写适用于Mac OS X和Linux的代码.如果我不得不这样做,我可以满足于在每种情况下使用最佳功能的宏,但我宁愿正确地做到这一点.

R..*_*R.. 5

如果您需要缩小地图,只munmap需要删除最后的部分.

如果你需要放大地图,你可以mmap使用MAP_FIXED旧地图上方的地址进行适当的偏移,但是你需要注意不要映射已经存在的其他东西......

罢工下的上述文字是一个糟糕的主意; MAP_FIXED除非你已经知道目标地址的内容并且想要自动替换它,否则从根本上说是错误的.如果你试图在地址范围是空闲的情况下机会性地映射新的东西,你需要使用mmap请求的地址,但没有 MAP_FIXED,看看它是否成功并给你所需的地址; 如果成功但使用不同的地址,您将要取消映射刚刚创建的新映射,并假设无法在请求的地址进行分配.


jil*_*les 0

您可以将文件截断为大尺寸(创建一个洞)并映射所有文件。如果文件是持久性的,我建议使用写入调用来填充该漏洞,而不是通过写入映射来填充,否则文件的块可能会在磁盘上产生不必要的碎片。

  • 您甚至不需要将磁盘上的文件设置得那么大。只是“mmap”比文件大小大。访问超出文件末尾的内容将导致“SIGBUS”,因此在尝试通过“mmap”访问新部分之前,您需要“ftruncate”更长时间,但否则没问题。 (3认同)