2016-02-27 90 views
4

我使用ftok/shmget/shmat/shmdt函數在Linux上創建,寫入和讀取共享段。Linux上共享內存的生命週期是什麼

如果我在一個程序中寫入段然後退出,隨後從另一個程序中讀取段,我驚訝地發現數據仍在那裏。

我原以爲,當共享一個段的最後一個進程執行shmdt時,該段將被釋放。

我可以依靠這種行爲嗎?或者,它類似於在free()之後繼續使用指針嗎?

+0

釋放該段並替換數據是兩回事。釋放並不一定意味着舊數據已被替換。在段被其他進程覆蓋之前,它將擁有它最初擁有的數據,但是對於其他程序來說它是垃圾。 –

+0

分離(shmdt)不會破壞共享內存段。爲此,您需要執行shmctl(),將IPC_RMID指定爲「cmd」。但是請注意,手冊頁(在Linux上)表示共享內存段ID不會被銷燬,直到所有進程都從其分離(shmdt)。 – TonyB

回答

4

共享內存區域一直保留,直到通過shmctl(shmid,IPC_RMID,...) [或系統重啓]將其刪除。這將在每個過程完成shmdt [或終止]後生效。

語義與文件非常相似。 shmat就像openshmdt就像close和[上述] shmctl就像unlink

如果你關閉了一個文件,你會希望它一直存在直到被刪除,不是嗎?所以,共享內存段的運作方式相似

0

shmdt只分離你的內存,在數據段上不執行擦除/覆蓋。直到其他一些進程映射並再次使用它,數據纔會持續。

此外,你應該使用更新的,符合POSIX mmap

+1

共享內存段至少具有內核生存期,並且通常在重新引導時消失。這意味着你必須顯式移除它們(semctl的IPC_RMID操作)。您可以將它們視爲*臨時文件*。 –

相關問題