【问题标题】:Share pointer between subprocesses在子进程之间共享指针
【发布时间】:2013-01-19 12:05:05
【问题描述】:

我有一个 64 位应用程序,它通过 popen2 实现创建 2 个子进程(32 位)。一切都是用 C++ 编写的。

我需要 2 个子进程来访问内存中的同一个对象,但我不知道如何执行此操作。

如果我理解正确,每个子进程都会有不同的内存映射,因此我不能只在两者之间传递内存地址。

附加信息:目标平台是 Mac 但我正在寻找一个尽可能独立于平台的答案 Mac 特定的答案很好,我可能不会在其他平台上使用这种方法.我只是对使用线程知之甚少;我走这条路是因为子进程必须是 32 位的。

【问题讨论】:

  • 目前最简单的方法是创建线程而不是子进程。
  • 您使用的是什么操作系统? [为什么不能使用线程?]
  • 假设你的目标平台是Linux,看看[这个问题/答案][1] [1]:stackoverflow.com/questions/5656530/…
  • 我在问题中添加了一些信息:我不知道如何从 64 位应用程序启动 32 位线程。我使用的是 Mac,但我正在寻找独立于平台的答案。
  • @MarceloCantos,@MatsPetersson 我的应用程序是 64 位并启动 2 x 32 位进程(每个子进程都链接到一个仅可用作 32 位的封闭源代码库)。在这种情况下是否可以使用线程?

标签: c++ ipc shared-memory popen


【解决方案1】:

您可以使用shared memory 概念。这意味着,您分配(使用操作系统服务)一个内存,这对两个子进程都是可见的。

根据 wiki 的建议,您可以使用 boost.interprocess 在平台无关级别上使用共享内存。

【讨论】:

    【解决方案2】:

    这是一个难题。

    您是正确的,每个进程都有自己的地址空间。一个进程创建的对象不能被另一个进程访问。

    可以使用共享内存,并将对象放在那里。一个复杂的问题是,通常共享内存段将在不同的地址映射到每个进程的地址空间。这意味着您不能在这些对象中使​​用指针。这可以通过使用索引而不是指针来缓解。

    此外,如果进程 A 是 32 位,进程 B 是 64 位,则 long 等基本类型可以有不同的宽度。因此,在这种情况下共享数据时,您需要使用固定宽度的类型,例如int32_t

    最后一个复杂因素是同步:如果一个进程可以在另一个进程读取或修改对象时修改它,那么您需要引入进程间同步。

    【讨论】:

    • 我将在两个 32 位进程之间共享一个对象,因此类型大小将相同。我想我可以为对象使用公共 API,然后我就不必乱用翻译指针了。所以这只是两个进程都可以访问对象的问题,不是吗? (以及同步问题)。
    • @koan:你知道对象内部不使用指针吗?如果是这样,那将是有问题的。
    猜你喜欢
    • 2013-12-24
    • 2013-05-07
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多