簡體   English   中英

mmap有多便攜?

[英]How portable is mmap?

我一直在考慮使用mmap進行文件讀取,並且想知道它是多么便攜。 我正在Linux平台上開發,但希望我的程序能夠在Mac OS X和Windows上運行。

我可以假設mmap正在這些平台上運行嗎?

mmap()函數是POSIX調用。 它適用於MacOS X(以及Linux,HP-UX,AIX和Solaris)。

問題區域是Windows。 我不確定POSIX“兼容性”子系統中是否有_mmap()調用。 它很可能會出現 - 但是會有一個帶有前導下划線的名稱,因為Microsoft有一個關於命名空間的替代視圖,並認為mmap()會侵入用戶名空間,即使您要求POSIX功能。 您可以在另一個SO問題( mmap() vs讀取塊中找到替代Windows界面MapViewOfFile()的定義和性能討論。

如果您嘗試在32位系統上映射大型文件,您可能會發現沒有足夠的連續空間來將整個文件分配到內存中,因此內存映射將失敗。 不要以為它會起作用; 如果失敗,決定你的后備策略是什么。

如果依靠將大量大文件映射到地址空間,使用mmap讀取文件是不可移植的 - 32位系統很容易沒有一個大的可用空間 - 比如說1G - 可用的地址空間,所以mmap會失敗通常用於1G映射。

我認為UNIX上的內存映射io不適用於交互式應用程序,因為它可能會導致SIGSEGV / SIGBUS(如果文件被其他進程同時截斷)。 忽略像setjmp / longjmp這樣生病的“解決方案”除了在獲得SIGSEGV / SIGBUS之后終止進程之外沒有什么可以做的。 將這些信號轉換為異常的新G ++功能似乎主要用於蘋果OS,因為描述表明,需要運行時支持此G ++功能,並且沒有任何關於此G ++功能的信息。 我們可能需要等待幾年,直到可以在Windows上找到類似於它的結構化異常處理,因為超過20年的時間進入UNIX。

內存映射文件的原理是相當可移植的,但是在Windows上沒有mmap()(但是存在類似MapViewOfFile()的東西)。 您可以查看python mmap模塊c代碼,了解它們如何為各種平台執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM