簡體   English   中英

進程之間不共享共享內存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM