我遇到了Boost managed_shared_memory
的设计/实施问题。
我有两个流程:Writer
和Reader
。
这里Writer
是一个C ++可执行文件,它使用boost在共享内存中写入。写入方法的代码快照:
shm_controller.reset(new boost::interprocess::managed_shared_memory( boost::interprocess::open_or_create, shmName, size));
void * addr = shm_controller->allocate(size) ;
shm_controller->deallocate(addr);
一旦我有addr指针,我使用memcpy
在SHM中写入。
另一方面,我有Reader
,这是C可执行文件。他们都通过消息传递应用程序进行通信。我用这样的方式编写了Reader
代码:
Writer
正在传递地址,该地址存储在" addr" (从上面的代码快照)到Reader
。Reader
收到地址和尺寸,我就会使用memcpy
从Reader
的本地变量中写入SHM数据。注1 :(此
Reader
未使用任何boost shm API,因为它的C应用程序)
注意2:我在Writer
和Reader
(通信后)验证地址相同。
但Reader
memcpy
读取shm数据导致我的可执行文件(Reader
)崩溃。
boost::interprocess::managed_shared_memory
吗?
Reader
Writer
访问shm {/ 1>}
答案 0 :(得分:2)
问。我们可以在C ??中使用boost :: interprocess :: managed_shared_memory
没有。从技术上讲,你当然可以(C是图灵完成),但它不受支持。
问。上一节是否存在任何实施问题。 (读者无法通过指针访问作者shm)
是的,您无法将指针从一个进程传递到另一个进程,因为它们具有隔离的地址空间。
问。有没有办法像任何包装器实现一样解决这个C和C ++限制。
通常的方法是在进程之间传递数据作为消息的一部分。使用您的邮件传递库(http://man7.org/linux/man-pages/man7/mq_overview.7.html,http://zeromq.org/等)。
注意:这也避免了同步访问共享内存的麻烦,您甚至都没有谈过。这给了我一个你没想到的想法
下一个最好的想法是在两端使用原始shm API并将 offset 传递到跨进程的共享内存区域。你仍然可以使用BIP,如果你限制自己shared_memory_object
例如offset_ptr