在两个进程(C和C ++)之间提升managed_shared_memory的使用率

时间:2017-10-08 14:16:35

标签: c++ c boost shared-memory boost-interprocess

我遇到了Boost managed_shared_memory的设计/实施问题。

问题

我有两个流程:WriterReader

  • 这里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收到地址和尺寸,我就会使用memcpyReader的本地变量中写入SHM数据。
  

注1 :(此Reader未使用任何boost shm API,因为它的C应用程序)
  注意2:我在WriterReader(通信后)验证地址相同。

Reader memcpy读取shm数据导致我的可执行文件(Reader)崩溃。

问题

  1. 我们可以在C ??
  2. 中使用boost::interprocess::managed_shared_memory吗?
  3. 上一节是否有任何实施问题。 (不能通过指针Reader Writer访问shm {/ 1>}
  4. 有没有办法像任何包装实现一样解决这个C和C ++限制。

1 个答案:

答案 0 :(得分:2)

  

问。我们可以在C ??中使用boost :: interprocess :: managed_shared_memory

没有。从技术上讲,你当然可以(C是图灵完成),但它不受支持。

  

问。上一节是否存在任何实施问题。 (读者无法通过指针访问作者shm)

是的,您无法将指针从一个进程传递到另一个进程,因为它们具有隔离的地址空间。

  

问。有没有办法像任何包装器实现一样解决这个C和C ++限制。

通常的方法是在进程之间传递数据作为消息的一部分。使用您的邮件传递库(http://man7.org/linux/man-pages/man7/mq_overview.7.htmlhttp://zeromq.org/等)。

注意这也避免了同步访问共享内存的麻烦,您甚至都没有谈过。这给了我一个你没想到的想法

下一个最好的想法是在两端使用原始shm API并将 offset 传递到跨进程的共享内存区域。你仍然可以使用BIP,如果你限制自己shared_memory_object例如offset_ptr