如何从叉子中检索 class 的实例?
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;
}
但是有了这个,我无法访问我的子进程的实例并调用该函数。有什么办法吗?
笼统而具体的答案:
操作系统进程无法在 class 实例及其方法的抽象级别进行通信(至少 - 不是您在应用程序中设计的实例和方法)。并且 - 单独的进程具有单独的内存 space(顺便说一下,这与线程不同)。因此,您的接待处将无法直接使用厨房里的任何物品。您将不得不使用某种进程间通信协议(例如使用管道或消息),或者如果您的 OS 支持它 - 使用进程间共享内存缓冲区。即使那样也不会完全像访问厨房的内存space,所以你需要小心。
这样不行。
您分叉了一个新的子进程,该子进程又创建了一个 newKitchen
的实例并将其附加到 myVector
。同时,父进程也做了同样的事情。现在你有两个不同的过程。或者更抽象地说 - 两个相同的比萨饼店 - 每个都有自己的厨房 - 都独立运作。
我假设这是一个学术练习,但我怀疑您需要某种消息传递或 IPC 机制,子进程通过该机制拥有新的厨房对象,父进程向子进程发送命令或消息以模拟 "orders" 被送到厨房。 Google 对于 Linux message queues
。一个结果 here
我假设您使用 fork 是有原因的(学术练习?)。否则,进行此模拟的更好、更简单的方法是使用线程而不是进程。或者更好的是,让整个事情保持单线程。
您需要使用共享内存。类 UNIX 系统有 <sys/shm.h>
,但也有 a boost library 可供您使用。另一种选择是使用 std::thread
s 而不是 fork()
ing 子进程。
我目前正在做一个项目,我需要重新创建一个比萨店。 我的比萨店由一个接待处 (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;
}
但是有了这个,我无法访问我的子进程的实例并调用该函数。有什么办法吗?
笼统而具体的答案:
操作系统进程无法在 class 实例及其方法的抽象级别进行通信(至少 - 不是您在应用程序中设计的实例和方法)。并且 - 单独的进程具有单独的内存 space(顺便说一下,这与线程不同)。因此,您的接待处将无法直接使用厨房里的任何物品。您将不得不使用某种进程间通信协议(例如使用管道或消息),或者如果您的 OS 支持它 - 使用进程间共享内存缓冲区。即使那样也不会完全像访问厨房的内存space,所以你需要小心。
这样不行。
您分叉了一个新的子进程,该子进程又创建了一个 newKitchen
的实例并将其附加到 myVector
。同时,父进程也做了同样的事情。现在你有两个不同的过程。或者更抽象地说 - 两个相同的比萨饼店 - 每个都有自己的厨房 - 都独立运作。
我假设这是一个学术练习,但我怀疑您需要某种消息传递或 IPC 机制,子进程通过该机制拥有新的厨房对象,父进程向子进程发送命令或消息以模拟 "orders" 被送到厨房。 Google 对于 Linux message queues
。一个结果 here
我假设您使用 fork 是有原因的(学术练习?)。否则,进行此模拟的更好、更简单的方法是使用线程而不是进程。或者更好的是,让整个事情保持单线程。
您需要使用共享内存。类 UNIX 系统有 <sys/shm.h>
,但也有 a boost library 可供您使用。另一种选择是使用 std::thread
s 而不是 fork()
ing 子进程。