2012-12-01 20 views
1

我有一個C++程序,我在其中使用fork(),但我需要能夠共享一個對象,可以讀取和寫入到父進程及其子進程之間。從我的在線閱讀來看,似乎mmap是這樣做的方式。以下是我有:一套C++ mmap

enum messageType {New = 0, Old = 1, No_Message = 2}; 

typedef struct { 
    enum messageType type; 
    unsigned int senderID; 
    char message[100]; 
} StoredMessageData; 

struct StoredMessage { 
    unsigned int recipientID; 
    vector<StoredMessageData> messages; 

    StoredMessage(const unsigned int& intRecipient = 0, const vector<StoredMessageData>& data = vector<StoredMessageData>()) 
    : recipientID(intRecipient), messages(data) 
    { 
     messages.reserve(10); 
    } 

    bool operator<(const StoredMessage& compareTo) const 
    { 
     return recipientID < compareTo.recipientID; 
    } 

    bool operator==(const StoredMessage& compareTo) const 
    { 
     return recipientID == compareTo.recipientID; 
    } 
}; 

然後在主:

set<StoredMessage> * msgs; 
msgs = mmap(NULL, sizeof(set<StoredMessage>), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); 

,後來在主我使用fork()。

我的問題有兩個部分:

1)一組是可變大小的,我已經知道,在每個分叉的過程中,我會希望能夠增加一個StoredMessage並添加StoredMessageData到StoredMessage中的矢量。但是,我不確定mmap是否可以處理這個問題......是不是隻爲基礎對象分配足夠的空間?我可以讓它分配到足以讓我做出這些補充嗎?

2)主營上面的代碼,目前拋出一個錯誤:

錯誤:從避免無效的轉換* A到ASTD ::集,性病::分配器> * A

有誰知道這意味着/如何解決它?

預先感謝您!

+0

我不想成爲灰心或任何事情,但如果你不能自己回答這些問題,你可能不應該這樣做。實際上,不,這不起作用。 –

+0

我很抱歉,如果他們其實很簡單的問題;我通常不用C++編程。但是,爲了學習,提供有用的答案而不是貶低的答案可能對未來更有幫助。 –

+0

我在說的是,你甚至沒有意識到這種方法的實際問題。你顯然沒有掌握C++基礎知識。而且答案是「這不起作用」。 –

回答

0

STL類std :: vector <>和std :: set <>使用operator new()分配內存。 運算符new()從進程堆分配內存。 堆不在共享內存中,因此一個進程分配的任何內容都不能被其他進程訪問。

你有幾個選擇。首先是從共享內存中分配std :: allocator <>。

第二個(也是我的首選)是不使用共享內存中使用指針的任何對象。 這幾乎消除了STL中的任何內容。

您還需要一個互斥鎖來控制對共享數據的訪問,因此兩個進程 不會損壞您的共享數據。

+0

你在這裏說的話已經在上面的問題評論中被覆蓋了,然後更多;請考慮爲您的帖子添加更多詳細信息,參考文獻和相關示例等,以增加有形價值。您可能還想探索替代方案(再次,比評論更詳細)。 – vladr