2009-07-14 96 views
9

我需要在OS X 10.4及更高版本上使用IPC將子進程中的大量數據(200kb +)傳遞給父進程,我閱讀了Unix上的共享內存,特別是System V和POSIX共享內存機制。然後我意識到,mmap()可以與MAP_ANON和MAP_SHARED標誌一起使用來做類似的事情(或者只是使用MAP_SHARED標誌,如果我不介意創建常規文件)。爲什麼使用SysV或POSIX共享內存vs mmap()?

我的問題是,是否有任何理由不使用mmap()?看起來更簡單一些,內存仍然是共享的,如果我使用MAP_ANON,它不需要創建一個真實的文件。我可以在父進程中創建文件,然後fork()和exec()子進程,並在子進程中使用它。

問題的第二部分是,這是什麼原因,這種方法是不夠的,一個將不得不使用SysV或POSIX共享內存機制?

注意,我打算做使用我需要其他通信管道同步,即父母在管道上請求數據,孩子其寫入共享內存,並響應在管道,它的準備。沒有涉及多個讀者或作者。可移植性不是優先事項。

回答

8

如果您有父母/子女關係,那麼使用mmap是完全正確的。

sysv_shm是允許相關和不相關進程共享內存的原始unix實現。 posix_shm標準化共享內存。

如果你在沒有mmap的posix系統上,你可以使用posix_shm。如果你在沒有posix_shm的情況下使用unix,你可以使用sysv_shm。如果你只需要共享內存vs父母/孩子,你可以使用mmap。

+0

你不能使用posix_shm沒有mmap,那部分是無稽之談。不過,在第一段中你是正確的,posix_shm在沒有父/子關係時啓用mmap。 – 2013-12-24 23:36:41

0

如果有內存服務,使用SysV/POSIX而不是mmap的唯一原因是可移植性。特別是較老的Unix系統不支持MAP_ANON。 Solaris,Linux,BSD和OS X ,但是,實際上,沒有什麼理由不使用mmap

1

shm在Linux中通過/dev/shm文件獲取mmap PED通常實現的,因此,性能應該是相當的 - 我會用mmap(W/MAP_ANONMAP_SHARED你提到)去爲簡單起見,如果我知道的可移植性如你所說的那樣,這不是問題。

0

至於documentation知道,你必須如果你想使用Xlib/XCB共享存儲器中的影像使用SYSV共享內存。