次の 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++では、すべてのプロセス/スレッドが同じグローバル変数にアクセスできると思いました。