2016-03-17 144 views
5

當我們創建一個共享內存我們使用shm_open()ftruncate()函數。根據我的信息shm_open()創建一個共享內存區域。然後我們使用ftruncate()函數來配置共享內存區域的大小。shm_open()和ftruncate()的用途?

那麼shm_open()在尚未知道大小的時候如何創建內存區域呢?如果情況並非如此,我完全錯了,那麼請告訴我shm_open()ftruncate().的用途。

回答

8

shm_open的要點是您可以打開現有的內存區域。但是,如果它不存在,您會創建創建它,shm_open在創建文件時的行爲與open相同;所述新創建的存儲區具有0尺寸從Linux manuals

O_CREAT

創建共享存儲器對象,如果它不存在。對象的用戶和組所有權取自調用進程的相應有效標識,並且根據模式的低9位設置對象的許可位,除了在進程文件模式創建掩碼中設置的那些位(請參閱umask(2))爲新對象清除。 open(2)中列出了一組可用於定義模式的宏常量。 (這些常數的符號定義可以通過包括得到。)

最初長度爲零的新共享內存對象 - 對象的大小可以用ftruncate(2).共享存儲器對象的新分配的字節被設置爲自動初始化爲0

(重點煤礦)

由於shm_open不採取新創建的區域的大小作爲一個參數(它會在系統調用/庫調用可添加參數的各種複雜的情況下),ftruncate()必須你sed將打開的共享內存區域的大小從其初始大小更改爲大小。


當然,你不必使用ftruncate對於已經正確地創建和調整其他地方的共享內存段。如果你想知道它的大小,請使用fstat。另請參見shm_overview(7)

+0

是的。 * shm_open *遵循shm區域*創建者*確定其大小的概念,*用戶*甚至不需要*知道*它。否則,你需要在各方之間有一定的合約。 – tofro