[英]shared memory is not shared between processes
我正在編寫一個服務器程序,它在其中接收來自客戶端的消息並向所有以前的客戶端廣播消息。 我需要在進程之間創建共享內存,但是共享內存似乎無法正常工作。
這是我的代碼:
int shmid2; key_t key2; void* shm2;
string name_list;
key2=ftok("tmp",'d');
//create
if ((shmid2 = shmget ( key2, sizeof(char)*1000, IPC_CREAT | 0666)) < 0) {
perror("shmget2");
exit(1);}
//attach
shm2 = shmat(shmid2, (void *)0, 0) ;
name_list= (char*) shm2;
if ( shm2 == (char *) -1) {
perror("shmat2");
exit(1);}
... do other things...
switch (pid=fork()){
case -1:
{ perror("ERROR on fork");
break;}
case 0://children
{
...modify name_list by getting message and append message to name_list..
name_list.append(message);
break;}
default://parent
close(connection);
}
當我在子進程中修改name_list時,似乎其他進程看不到此修改。 任何人都可以提出建議嗎? 謝謝!!
更新:我試圖按照建議更改為該設置,但仍然無法正常工作。
name_list = (char*) shmat(shmid2, (void *)0, 0) ;
有人可以幫我嗎? 非常感謝!
當您將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字節緩沖區。
總結一下:如果使用字符串類,則將始終操作共享內存的副本。
兩種解決方案:1.不要使用字符串,而是使用標准C方法直接操作char數組(例如,使用strcat追加字符)2.完成name_list的修改后,將其復制回共享內存。
版本1更快。 版本2更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.