1

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

我需要 2 个子进程来访问内存中的同一个对象,我不知道如何做到这一点。

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

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

4

2 回答 2

2

您可以使用共享内存概念。这意味着,您分配(使用操作系统服务)一个内存,这两个子进程都可以看到。

正如 wiki 推荐的那样,您可以使用boost.interprocess在平台无关级别上使用共享内存。

于 2013-01-19T12:13:03.833 回答
1

这是一个难题。

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

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

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

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

于 2013-01-19T12:10:25.230 回答