2011-06-09 43 views
3

說我有一個c程序(在Linux環境中),它使用共享內存向多個進程發送數據和從多個進程發送數據。我們稍後在程序中說,並行進程完成,我只有一個進程。現在,但我想fork()關閉另一個進程,但是這次我不希望該內存段被共享,我希望父進程和子進程都能夠修改這些值而不會相互影響,就像這是私人記憶。有沒有辦法做到這一點;將共享內存轉換爲私有內存,但讓它佔用虛擬內存中的相同空間,或使共享內存拷貝寫入?是否可以將一段共享內存轉換爲專用內存?

+0

你是如何創建共享內存的?如果通過mmap(),您可能會找到一種方法將屬性更改爲MAP_PRIVATE - 儘管我不認爲有一種標準的方法來更改映射。否則,不,或者只有'longhand' - 創建一個新區域,將舊區域複製到新區域,取消舊區域映射,使用新區域。如果新玩家必須與舊玩家位於同一位置,則重複此過程以將流離失所的新玩家複製到原始位置。 – 2011-06-09 15:52:12

回答

3

那麼,我可以從便攜式POSIX API中想到這樣做的唯一方法就是讓子映射某個其他位置的某個新段(隨機),複製數據,然後分離原始段並將新段重新附加到正確的地址。聽起來很醜。

完成後,您可以取消鏈接新的細分,以防止其他人附加到該細分。

現在我看看手冊頁,如果您有FD到shm對象,您可以嘗試在右側地址的子對象中將shm對象重新映射爲MAP_PRIVATE。但是「沒有指定在映射區域中是否可見mmap()調用後對文件所做的更改」,因此您需要測試該文件並且危險地運行或使用其他技術。