2015-05-28 53 views
1

假設我有一個父親進程p1及其子進程p2p1創建p2並讓p 2執行某些操作,然後將結果存儲到std::map中。現在p1想要訪問地圖。如何在linux的兩個進程之間傳遞一個映射?

這是進程間通信,我想用共享內存來做到這一點。 我正在考慮兩種解決方案。

  1. p2將映射轉儲到char數組並將其寫入共享內存,然後p1讀取共享內存以重新構建映射。地圖的類型是<std::string, double>,但我不確定如何將其轉儲到char數組。

  2. 在P2中,假設指針到共享存儲器是void *shm,我可以分配使用這種方式std::map<std::string, double>* result = (std::map<std::string, double>*)shm地圖的存儲器,然後插入元件result?在p1中,我可以做同樣的事情std::map<std::string, double>* result = (std::map<std::string, double>*)shm然後迭代地圖。但我不確定這是否正確。

+0

您是否需要從p2到p1的一次性副本,還是需要共享數據 - 答案可能會通知您選擇的解決方案。 –

+0

順便說一句,在你的第一個選擇中,你正在尋找的是所謂的編組/取消編組。一種可能的方法是隻打印到數組中,例如'snprintf(shmbuffer,sizeof(shmbuffer),「%s%f \ n」,StrVar,DbleVar);'更復雜/更復雜的方法當然是可能的。 –

+0

我只需要一次拷貝,因爲p2會在執行後退出。然後,p1將創建另一個子進程p3並重復該過程。 –

回答

2

我問過類似的問題,不久前:

boost unordered map in shared memory using std::string key

我們沒有使用std ::地圖或升壓:: unordered_map共享內存,因爲它不容易維護和調試。我們在boost共享內存(基本上是共享內存上的一個數組)中構建自己的散列表,並且它工作正常。

在您的情況下,您可以將映射轉儲到內存,就像寫入二進制文件一樣。第二個進程從共享內存中讀取並重建映射。

如果您的密鑰不是很長,您可以將映射作爲一個固定大小的結構數組轉儲到共享內存中,這非常容易編寫和讀取。

您的第二種方法可能無法正常工作。

相關問題