我有一个内部调用“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 类”的共享内存段,并在子进程中打开共享内存段时,我能够访问子进程中的“cnt”变量。但是,我无法访问子进程中的子对象。
我相信这是因为子对象是动态分配的,我们在子进程中分配了不同的动态内存,并且它们与共享内存段无关。
我发现即使对于 std::string,boost 也会提供 boost::interprocess::string,因为字符串在内部进行"new"调用。
请建议在多个进程之间共享此“复杂对象”的最佳 IPC 机制。
最佳答案
如果你想在共享内存中使用该类成员安排,你必须将对 new
的调用替换为从共享内存中的池中检索内存的调用:你需要为此找到或编写一个合适的池分配器——标准没有提供一个,但是 boost 使用偏移量而不是指针提供了一些非常接近的东西(这更灵活,因为坚持在特定的绝对虚拟地址加载共享内存并不是特别可靠或可扩展)- 参见 here
替代方案是使用线程,将数据序列化到共享内存并将其反序列化(例如,到 stringstream
然后将 .str()
数据复制到共享内存) ,并将 subclass
对象直接存储在 Complex
中,而不是使用指针。
关于c++ - 我可以使用共享内存或其他 IPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24053054/