我有一个内部进行“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机制。
答案 0 :(得分:0)
如果要在共享内存中使用该类成员排列,则必须将对new
的调用替换为也在共享内存中从池中检索内存的调用:您将要执行此操作我需要找到或编写一个合适的池分配器 - 标准不提供一个,但是boost使用偏移而不是指针提供了非常接近的东西(这更灵活,因为坚持在特定的绝对虚拟地址加载共享内存isn& #39;特别可靠或可扩展) - 请参阅here
替代方法是使用线程,将数据序列化到共享内存并对其进行反序列化(例如,到stringstream
然后将.str()
数据复制到共享内存),并存储{{1}直接在subclass
中对象而不是指针。