我使用ftok/shmget/shmat/shmdt函數在Linux上創建,寫入和讀取共享段。Linux上共享內存的生命週期是什麼
如果我在一個程序中寫入段然後退出,隨後從另一個程序中讀取段,我驚訝地發現數據仍在那裏。
我原以爲,當共享一個段的最後一個進程執行shmdt時,該段將被釋放。
我可以依靠這種行爲嗎?或者,它類似於在free()之後繼續使用指針嗎?
我使用ftok/shmget/shmat/shmdt函數在Linux上創建,寫入和讀取共享段。Linux上共享內存的生命週期是什麼
如果我在一個程序中寫入段然後退出,隨後從另一個程序中讀取段,我驚訝地發現數據仍在那裏。
我原以爲,當共享一個段的最後一個進程執行shmdt時,該段將被釋放。
我可以依靠這種行爲嗎?或者,它類似於在free()之後繼續使用指針嗎?
共享內存區域一直保留,直到通過shmctl(shmid,IPC_RMID,...)
[或系統重啓]將其刪除。這將在每個過程完成shmdt
[或終止]後生效。
語義與文件非常相似。 shmat
就像open
。 shmdt
就像close
和[上述] shmctl
就像unlink
。
如果你關閉了一個文件,你會希望它一直存在直到被刪除,不是嗎?所以,共享內存段的運作方式相似
shmdt
只分離你的內存,在數據段上不執行擦除/覆蓋。直到其他一些進程映射並再次使用它,數據纔會持續。
此外,你應該使用更新的,符合POSIX mmap
。
共享內存段至少具有內核生存期,並且通常在重新引導時消失。這意味着你必須顯式移除它們(semctl的IPC_RMID操作)。您可以將它們視爲*臨時文件*。 –
釋放該段並替換數據是兩回事。釋放並不一定意味着舊數據已被替換。在段被其他進程覆蓋之前,它將擁有它最初擁有的數據,但是對於其他程序來說它是垃圾。 –
分離(shmdt)不會破壞共享內存段。爲此,您需要執行shmctl(),將IPC_RMID指定爲「cmd」。但是請注意,手冊頁(在Linux上)表示共享內存段ID不會被銷燬,直到所有進程都從其分離(shmdt)。 – TonyB