我一直在考虑使用mmap
进行文件阅读,并且想知道它是多么便携。
我正在Linux平台上开发,但希望我的程序可以在Mac OS X和Windows上运行。
我可以假设mmap
正在这些平台上运行吗?
答案 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。