我目前正在一个需要重建比萨店的项目中。 我的比萨店由接待处(CLI)组成,该处向厨房下达命令(子过程)。
每个厨房都有一些我想从接待处使用的成员函数,为此,我选择了一个std::vector<Kitchen>
来在每个厨房中循环调用我想要的函数。 / p>
以下是我的问题,如何跟踪向量中的所有实例?
现在,我想做这样的事情:
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;
}
但是,与此同时,我无法访问子进程的实例并调用该函数。有什么办法吗?
答案 0 :(得分:1)
一个一般而具体的答案:
操作系统进程无法在类实例及其方法(至少-不是您在应用程序中设计的实例和方法)的抽象级别上进行通信。并且-单独的进程具有单独的内存空间(顺便说一下,与线程不同)。因此,您的接待处将无法直接与厨房拥有的任何物体进行实际工作。您可能必须使用某种进程间通信协议(例如使用管道或消息),或者如果您的操作系统支持它-请使用进程间共享内存缓冲区。即使那样也并不完全像访问Kitchens的存储空间一样,因此您需要小心。
答案 1 :(得分:1)
那行不通。
您已经派生了一个新的子进程,该子进程又创建了一个newKitchen
的实例并将其附加到myVector
。同时,父进程也做了同样的事情。现在您有两个不同的过程。或更抽象地讲-两个相同的比萨店-每个都有自己的厨房-都独立运行。
我认为这是一项学术活动,但是我怀疑您需要某种消息传递或IPC机制,子进程拥有新的厨房对象,父进程将命令或消息发送给子进程以模拟“订单”发送到厨房。 Google Linux message queues
。一个结果here
我假设您出于某种原因使用叉(学术练习?)。否则,进行此模拟的更好,更轻松的方法是使用线程而不是进程。还是更好,只需将整个内容保持单线程。
答案 2 :(得分:0)
您需要使用共享内存。类似UNIX的系统有<sys/shm.h>
,但是您也可以使用a boost library。另一种选择是使用std::thread
而不是fork()
处理子进程。