繁体   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