2010-01-25 36 views
5

我一直在考虑使用mmap进行文件读取,并想知道它是多么便携。 我正在linux平台上开发,但希望我的程序能够在osx和windows上工作。如何便携是mmap

我可以假设mmap正在这些平台上工作吗?

感谢

回答

8

'mmap()'函数是一个POSIX调用。它在MacOS X(以及Linux,HP-UX,AIX和Solaris)上运行良好。

问题区域将是Windows。我不确定是否在POSIX“兼容性”子系统中调用了_mmap()。它很可能就在那里 - 但是它的名称会带有下划线,因为微软在命名空间上有一个替代视图,并且认为mmap()会侵入用户名空间,即使您要求提供POSIX功能。您可以在另一个SO问题中找到另一个Windows界面MapViewOfFile()的定义以及关于性能的讨论。

2

内存映射文件的原则是相当便携的,但你没有的mmap()在Windows上(但事情好像MapViewOfFile()存在)。你可以看一下python mmap模块的c代码,看看它们是如何为各种平台做的。

3

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

2

我考虑UNIXs 作为不可用于交互式应用, 存储器映射输入输出,因为它可能导致SIGSEGV/SIGBUS (在文件的情况下,已被其他进程同时截断)。 忽略像setjmp/longjmp 这样的病态“解决方案”,除了在获得SIGSEGV/SIGBUS之后终止进程之外,没有其他办法可以做。 新的G ++功能将这些信号转换为例外 似乎主要针对苹果OS ,因为该说明指出,需要运行时支持此G ++功能 ,并且没有关于此G ++功能的任何信息。 我们可能要等上几年,直到20多年来进入UNIX的方式才能在windows上找到像它这样的结构化异常处理。

+0

虽然你没有直接回答我发现这个问题真的很有帮助,但是谢谢。 – 2014-02-20 18:05:59

+0

内存映射io不适用于UNIX上的非平凡应用程序影响内存映射io的可移植性 – 2014-02-24 20:51:31