【问题标题】:Boost's managed_shared_memory usage in between two processes (C and C++)Boost 在两个进程(C 和 C++)之间的 managed_shared_memory 使用情况
【发布时间】:2018-03-19 19:33:05
【问题描述】:

我遇到了 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上验证的地址相同(通信后)。

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


问题

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

【问题讨论】:

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


    【解决方案1】:

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

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

    Q. 上面的部分是否有任何实现问题。 (读者不能通过指针访问作者的 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

    【讨论】:

    • sehe >> [ 不。从技术上讲,您当然可以(C 已经完成),但不支持。 ] --> 所以你的意思是说 Boost 没有 api,但我们可以通过某种方式做到这一点。您能否提供更多关于这种其他方式的信息?你说 [" raw shm API on both and pass the offset into the shared-memory area across processes. You can still use BIP" ] --> BIP 表示提升。正确的 ?我如何使用 boost,因为我在 C-lang 上有一个进程。原始 SHM-API,请您说出一些可以在 C 和 C++ 之间使用的 API。
    • 我的意思是你可以在 C 中复制 Boost 的代码。当然这样做很愚蠢。
    • BIP 确实意味着 Boost InterProcess
    • C++ 是 C 的超集。在 C 和 C++ 中都使用 shmem API (man7.org/linux/man-pages/man7/shm_overview.7.html)。
    • 哦。我在 C++ 和 boost 中准备了 API,但看起来我必须为 C 和 SHM API 返工。顺便说一句,谢谢Sehe...如果没有任何问题,我会等待一段时间,我会将您的回复标记为答案并关闭它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2015-07-02
    • 2019-03-08
    • 2011-02-08
    • 1970-01-01
    • 2011-04-26
    • 2012-10-22
    相关资源
    最近更新 更多