1

fork()を使用する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()を使用します。

私の質問には2つの部分があります:

1)セットのサイズは可変であり、フォークされた各プロセスで、StoredMessageを追加し、StoredMessageのベクターにStoredMessageDataを追加できるようにする必要があることはすでにわかっています。しかし、mmapがこれを処理できるかどうかはわかりません...ベースオブジェクトに十分なスペースを割り当てるだけではありませんか?これらの追加を行えるように十分に割り当てることができますか?

2)mainからの上記のコードは、現在エラーをスローしています。

エラー:âvoid*âからâstd:: set、std ::allocator>*âへの無効な変換

誰かがこれが何を意味するのか/それを修正する方法を知っていますか?

前もって感謝します!

4

1 に答える 1

0

STL クラス std::vector<> および std::set<> は、演算子 new() を使用してメモリを割り当てます。演算子 new() は、プロセス ヒープからメモリを割り当てます。ヒープは共有メモリ内にないため、あるプロセスによって割り当てられたものは、他のプロセスからアクセスできません。

いくつかの選択肢があります。まず、共有メモリから割り当てる std::allocator<> を作成します。

2 つ目 (および私の好み) は、ポインターを使用する共有メモリ内のオブジェクトを使用しないことです。これにより、STL からほとんど何も排除されます。

また、共有データへのアクセスを制御するミューテックスも必要になるため、2 つのプロセスによって共有データが破損することはありません。

于 2012-12-01T05:31:02.253 に答える