2010-01-25 52 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