我可以使用共享内存或其他IPC

时间:2014-06-05 06:27:39

标签: c++ memory boost

我有一个内部进行“std :: system”调用的进程。 (我相信系统调用会产生一个子进程)。在系统调用中,我正在执行不同的应用程序

void generate()
{
   std::system("./childProcess.exe);
}

上面的“生成函数”将由多个线程调用。 现在,我需要从父进程到子进程共享一个“复杂对象”,即childProcess.exe。

我尝试使用Boost :: interprocess :: shared_memory,但徒劳无功。

我前面提到的复杂对象在内部动态分配内存很多次。我相信那些动态分配的内存与我的共享内存段无关。如果不这样,请纠正我

我的班级就像这样

Complex compClass
{
   int cnt;
   subclass *subobj;
}

compClass::compClass()
{
   subobj=new subclass;
   subobj->func;
}
subclass::func()
{
   YClass *y = new YClass;
}

等等,它内部有很多这样的内存分配。

当我在父进程中创建对象类型“Comp class”的共享内存段,并在子进程中打开共享内存段时,我可以在子进程中访问“cnt”变量。但是,我无法在子进程中访问子对象。

我认为这是因为子对象是动态分配的,我们在子进程中分配了不同的动态内存,并且它们与共享内存段没有关联。

我发现即使对于std :: string,boost也会出现boost :: interprocess :: string,因为string内部会进行“new”调用。

请建议在多个进程之间共享这个“复杂对象”的最佳IPC机制。

1 个答案:

答案 0 :(得分:0)

如果要在共享内存中使用该类成员排列,则必须将对new的调用替换为也在共享内存中从池中检索内存的调用:您将要执行此操作我需要找到或编写一个合适的池分配器 - 标准不提供一个,但是boost使用偏移而不是指针提供了非常接近的东西(这更灵活,因为坚持在特定的绝对虚拟地址加载共享内存isn& #39;特别可靠或可扩展) - 请参阅here

替代方法是使用线程,将数据序列化到共享内存并对其进行反序列化(例如,到stringstream然后将.str()数据复制到共享内存),并存储{{1}直接在subclass中对象而不是指针。