2011-04-27 97 views
3

我在進程之間使用boost :: interprocess :: shared_memory_object。如何測試boost共享內存對象是否被刪除?

進程(服務器)創建共享內存對象,其他進程(客戶端)打開該共享內存對象。但是,客戶端進程如何確定共享內存對象是否被服務器進程刪除?

As boost documentation states,當請求刪除共享內存時,它將不會被刪除,直到所有其他引用取消引用爲止。因此,即使服務器進程(試圖)刪除共享內存對象,該共享內存對象也不會被刪除,因此,其他客戶端進程無法知道該進程是否被刪除。

由於引用緩存,我需要這種刪除檢測。我的意思是,客戶端進程存儲對共享內存的引用,並在需要時重用它。但是,當服務器進程刪除共享內存並使用相同名稱重新創建共享內存時,我只希望我的客戶端進程檢測到這種重新創建並更新對新創建的共享內存對象的引用。

+0

您可以使用unix ipcs命令監視共享內存使用情況,但它可能無助於您的原因 – Arunmu 2011-04-27 04:50:40

回答

2

您可以在您的共享內存對象中包含一個標誌,指示您的服務器進程是否仍在使用它。

在您的服務器進程嘗試刪除共享內存之前,將此標誌設置爲false。當客戶端進程看到該標誌爲false時,他們可以關閉對該對象的引用。

此外,我不認爲服務器進程將被允許重新創建具有相同名稱的共享對象,直到它被刪除,因爲我確信這些名稱必須是唯一的。

+0

在共享內存中添加額外的標誌看起來不錯。 – 2011-04-28 05:31:25

+0

但是,服務器可以使用相同的名稱重新創建共享內存,因爲當請求刪除並且其他人正在引用它時,它只是將內部對象的名稱更改爲不與原始名稱衝突。在我的Win32實驗中,分頁文件的名稱在刪除時被更改爲一些隨機(?)名稱。此外,boost文檔聲明(並要求)使用相同名稱的娛樂在任何情況下都會成功。 – 2011-04-28 05:34:24

3

命令

ipcs -m 

將顯示所有現有的共享存儲器段。通過shmid你應該能夠識別你的細分市場。還有nattch列顯示附加到段的進程的數量。

相關問題