Когда вы присваиваете std::string
объект name_list
указателю, который вы получаете из общей памяти:
string name_list;
// ...
shm2 = shmat(shmid2, (void *)0, 0) ;
name_list= (char*) shm2;
// ...
name_list.append(message);
вы вызываете оператор присваивания строки, который копирует указатель, который передается в новую память. Когда ваш код манипулирует name_list
, он манипулирует копией , оставляя общую память без изменений.
Похоже, вы пытаетесь записать в общую память из одного процесса, а читать из нее в другом процессе, что не является тривиальной проблемой для решения. Выяснить, какой процесс может считывать и записывать какие части памяти сложно, как поддерживать когерентность кэша. Посмотрите на кольцевые буферы производителя-потребителя (либо в Google, либо здесь, в Stack Overflow), чтобы найти некоторые стандартные решения этой проблемы.
Чтобы ответить на исходный вопрос, после того, как вы манипулировали строкой в локальной памяти, вам необходимо поместить ее обратно в общую память. Это будет сделано в крайнем случае:
if(name_list.size() <= 1000) {
memcpy(shm2, name_list.data(), name_list.size());
} else {
// error: name list overflowed shared memory
}
Вы также можете напрямую управлять разделяемой памятью, используя указатель shm2
, напрямую используя указатели C, стараясь не переполнить 1000-байтовый буфер.