我有一个64位应用程序,通过popen2实现创建2个子进程(32位)。一切都是用C ++编写的。
我需要2个子进程来访问内存中的同一个对象,我不知道如何做到这一点。
如果我理解正确,每个子进程将有一个不同的内存映射,因此我不能只在两者之间传递一个内存地址。
其他信息:目标平台是Mac ,但我正在寻找尽可能与平台无关的答案 Mac特定答案很好,我可能不会在其他平台上使用此方法。我根本不了解使用线程;我沿着这条路走下去,因为子进程必须是32位。
答案 0 :(得分:2)
您可以使用shared memory概念。这意味着,您(使用OS服务)分配一个内存,这两个子进程都可以看到。
随着wiki重新构建,您可以使用boost.interprocess在独立于平台的级别上使用共享内存。
答案 1 :(得分:1)
这是一个难题。
您是正确的,每个进程都有自己的地址空间。另一个进程无法访问由一个进程创建的对象。
可以使用共享内存,并将对象放在那里。一个复杂的问题是,通常共享内存段将在不同的地址映射到每个进程的地址空间。这意味着您不能在这些对象中使用指针。这可以通过使用索引而不是指针来缓解。
此外,如果进程A是32位且进程B是64位,则诸如long
的原始类型可以具有不同的宽度。因此,在这种情况下共享数据时,您需要使用固定宽度类型,例如int32_t
。
最后一个复杂因素是同步:如果进程可以在另一个进程正在读取或修改它时修改对象,则需要引入进程间同步。