我的問題是關於初始化使用shm_open()
和mmap()
獲得存儲器。我在幾個地方都看到一個共同的建議是呼籲shm_open()
與標誌O_CREAT|O_EXCL
:如果成功那麼我們是共享內存的第一個用戶,並可以初始化它,否則我們不是第一,共享內存已經被初始化另一個過程。POSIX共享存儲器初始化
但是,根據我對shm_open
的瞭解以及我在Linux上所做的測試,這樣做不起作用:即使在共享內存對象的最後一個用戶擁有共享內存對象後,共享內存對象仍留在系統中未映射並關閉。這就要求shm_open
與O_CREAT|O_EXCL
一個簡單的測試程序,然後關閉描述符和退出,將在第一次運行成功,但仍然會失敗的第二次運行,即使沒有其他人使用當時的共享內存。
在我看來,(至少在我測試的系統上)shm_open
的行爲與open()
的行爲幾乎完全相同:如果我修改我的簡單測試程序來向共享內存寫入內容(通過獲得的指針由mmap
)並退出,然後共享內存對象將保持其內容持久(我可以運行另一個簡單的程序來回讀我以前寫的數據)。
所以是關於使用shm_open
與O_CREAT|O_EXCL
只是錯了,還是我失去了一些東西的建議嗎?
我知道,共享內存對象可以用shm_unlink()
被刪除,但似乎只會造成更多的問題:
如果一個進程調用
shm_unlink()
前去世,然後我們又回到了所描述的問題以上。如果一個進程調用
shm_unlink()
而其他一些進程仍然映射到同一個共享內存中,這些其他進程仍然照常繼續使用它。現在,如果另一個進程來並調用shm_open()
具有相同的名稱,並指定O_CREAT
,它實際上將具有相同的名稱,這是完全無關的舊共享內存的其他進程仍在使用對象創建新的共享內存對象成功。現在我們有一個進程試圖通過共享內存與其他進程通信,並且完全不知道它正在使用錯誤的通道。
我習慣了其中共享內存對象只存在只要至少一個手柄處於打開位置,以它的Windows語義,所以這Posix的東西是非常混亂。
它看起來像你沒有設置你的shm段刪除,當你完成它。因此,它需要你的過程。您可以在終端中使用'ipcs'命令來查看系統中當前存在哪種_IPC_(信號量,shm段等)。 – Rerito
但我如何設置刪除?是否有一些標誌傳遞給shm_open()?我在manpage上找不到任何東西。 –
@Rerito:關於評論評論的任何想法? – alk