在共享内存中分配对象

时间:2011-06-20 12:23:14

标签: c++

这可能是一个愚蠢的问题,但......我有两个进程P1和P2。 P1可以在共享内存中轻松地分配对象O吗? (P1使用管道向P2传递指向O的指针)。类似的东西:

// P1
ptr1 = new SharedMemoryObject(); // object O
pipe.send(ptr1)

// P2
ptr = pipe.recieve()
// I have access to O now

我想避免序列化和管道化对象,我想在共享内存中创建它们并传递指针

3 个答案:

答案 0 :(得分:3)

没有。 P1的指针对P2没有意义。

但是,您可能希望阅读“基础指针”,这对于进程间通信更有效。

作为副作用,任何在内部使用普通指针(而不是基于指针)的类都不能以这种方式共享。

答案 1 :(得分:3)

每个进程都有自己的地址空间,这意味着虽然可以在两个进程之间共享物理内存地址,但这可能对应于每个进程的地址空间中的不同地址。这意味着在设计将存在于共享内存中的对象时,必须确保它们使用偏移量或索引而不是纯指针。

共享内存会产生同步问题,导致问题无法解决,所以除非您真的需要,否则我建议您使用管道路径优先于共享内存。

答案 2 :(得分:0)

这个答案专门针对linux

您可以使用shm_open功能创建或打开共享内存文件,该文件可以是mmap()-ed。正如您在mmap的手册页中看到的那样:

  

对象所在的实际位置   映射由mmap()

返回

  

成功时,mmap()返回一个指针   到映射区域。出错了,   值MAP_FAILED(即,(void *)   返回-1),并正确设置errno。

因此,您无法将指针从一个进程传递到另一个进程。但是,您可以传递共享内存名称。