0

次の C++ コードがあります。

map<string, map<string, deque<Event> > > events;

int main(){
        //set up socket and stuff here (omitted for clarity)
        while(1){
                newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &client_len);
                if (newsockfd < 0)
                        error("ERROR on accept");

                pid = fork();
                if (pid < 0)
                        error("ERROR on event server fork");

                if (pid == 0){  //Child Process
                        close(sockfd);

                        //do stuff here
                        read_and_send_ack (newsockfd);
                        exit(0);
                }

                else //Parent Process
                        close(newsockfd);
}

void read_and_send_ack (int sockfd)
{
        // buffer is basically a string
        //do some non important stuff here, omitted for clarity
        event_received(buffer, &events);
}

void event_received(char* event_info, map<string, map<string, deque<Event> > >* events)
{
        Event event = Event(event_info);
        (*events)[string(event.device)][string(event.dev_id)].push_back(event);

        //print keys to test if events are being modified each turn
        for (map<string, map<string, deque<Event> > >::iterator it = events->begin(); it!=events->end(); ++it)
                cout << it->first;
}

while ループがコンテナに追加するものを受け取るたびに、グローバル コンテナの「イベント」が変更されることを期待しています。しかし、変化は持続しません。その結果、キーを印刷するたびに、コンテナーにはキーが 1 つしかありません。何が起こっている?C++では、すべてのプロセス/スレッドが同じグローバル変数にアクセスできると思いました。

4

1 に答える 1

1

私のコメントを答えに変えます。

によって子プロセスが作成されると、グローバル変数を含むfork()プロセス状態の独自のコピーが取得されます。

親プロセスと子プロセスが通信できるようにするには、何らかの形のチャネル (パイプ、ファイル、共有メモリなど) をセットアップする必要があります。

于 2013-06-10T07:37:07.440 に答える