如何从分支中检索类的实例
How to retrieve instance of class from a fork?
我目前正在做一个项目,我需要重新创建一个比萨店。我的比萨店由接待处(CLI(组成,它向厨房(子流程(下达命令。
每个厨房都有几个我想从接待处使用的成员函数,为了做到这一点,我选择有一个std::vector<Kitchen>
来循环调用我想要的每个厨房中的函数。
我的问题是以下几点,如何跟踪向量中的所有实例?
现在,我想做这样的事情:
int Reception::openKitchen(void)
{
int pid = fork();
Kitchen newKitchen;
if (pid == -1) {
std::cerr << "Can't open a new kitchen" << std::endl;
return -1;
} else if (pid == 0) { // In the child process
// Do something in the child
} else { // In my parent
this->myVector.push_back(newKitchen); // Try to keep track of the new instance of Kitchen
}
return 0;
}
但是有了这个,我无法访问我的子进程的实例并调用该函数。有什么办法可以做到这一点吗?
一个一般的而不是具体和具体的答案:
操作系统进程无法在类实例及其方法(至少不是您在应用程序中设计的实例和方法(的抽象级别进行通信。而且 - 单独的进程具有单独的内存空间(顺便说一下,与线程不同(。因此,您的接待处将无法直接使用厨房的任何物品。您必须使用某种进程间通信协议(例如使用管道或消息(,或者如果您的操作系统支持它 - 利用进程间共享内存缓冲区。即使这样也不完全像可以访问厨房的内存空间一样,因此您需要小心。
它不是那样工作的。
您已经分叉了一个新的子进程,该子进程又会创建一个newKitchen
实例并将其追加到myVector
。 同时,父进程也做了同样的事情。 现在您有两个不同的过程。 或者更抽象地说 - 两家相同的比萨饼店 - 每家都有自己的厨房 - 都独立运作。
我认为这是一个学术练习,但我怀疑你需要某种消息传递或IPC机制,通过该机制,子进程拥有新的厨房对象,父进程向子进程发送命令或消息以模拟发送到厨房的"订单"。 谷歌Linux message queues
. 这里有一个结果
我假设你使用 fork 是有原因的(学术练习? 否则,执行此模拟的更好和更简单的方法是使用线程而不是进程。 或者更好的是,保持整个事情单线程。
您需要使用共享内存。类UNIX系统有<sys/shm.h>
,但还有一个可以使用的提升库。另一种选择是使用 std::thread
而不是fork()
子进程。
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 使用VerQueryValue检索应用程序的文件描述
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 从新实例的向量中检索数据返回 0
- 如何从分支中检索类的实例
- 检索模板是从中实例化的
- 从映射中检索对象实例
- 在JNI jobject中存储一个c++对象实例,稍后检索