mmap有多便携?

时间:2010-01-25 23:36:51

标签: windows linux macos mmap

我一直在考虑使用mmap进行文件阅读,并且想知道它是多么便携。 我正在Linux平台上开发,但希望我的程序可以在Mac OS X和Windows上运行。

我可以假设mmap正在这些平台上运行吗?

4 个答案:

答案 0 :(得分:10)

mmap()函数是POSIX调用。它适用于MacOS X(以及Linux,HP-UX,AIX和Solaris)。

问题区域是Windows。我不确定POSIX“兼容性”子系统中是否有_mmap()调用。它很可能会出现 - 但是会有一个带有前导下划线的名称,因为Microsoft有一个关于命名空间的替代视图,并认为mmap()会侵入用户名空间,即使您要求POSIX功能。您可以在另一个SO问题(MapViewOfFile()中找到替代Windows界面mmap() vs reading blocks的定义和性能讨论。

如果您尝试在32位系统上映射大型文件,您可能会发现没有足够的连续空间来将整个文件分配到内存中,因此内存映射将失败。不要以为它会起作用;如果失败,请确定你的后备策略。

答案 1 :(得分:3)

如果依靠将大量大文件映射到地址空间,使用mmap读取文件是不可移植的 - 32位系统很容易没有一个大的可用空间 - 比如1G - 可用的地址空间如此mmap对于1G映射会经常失败。

答案 2 :(得分:2)

内存映射文件的原理是相当可移植的,但是在Windows上没有mmap()(但是存在像MapViewOfFile()这样的东西)。您可以查看python mmap模块c代码,了解它们如何为各种平台执行此操作。

答案 3 :(得分:2)

我在UNIX上考虑内存映射io 因为不适用于交互式应用程序, 因为它可能导致SIGSEGV / SIGBUS (如果文件被其他进程同时截断)。 忽略像setjmp / longjmp这样的病态“解决方案” 除了在获得SIGSEGV / SIGBUS后终止进程之外,没有什么可以做的。 新的G ++功能可将此类信号转换为异常 似乎主要用于苹果OS, 由于描述说明,需要运行时支持此G ++功能 并且在任何地方都没有关于此G ++功能的信息。 我们可能需要等待几年,直到可以在Windows上找到类似于它的结构化异常处理,因为20多年后它已经进入UNIX。