如何从fork检索类的实例?

时间:2019-04-27 19:37:37

标签: c++ fork stdvector

我目前正在一个需要重建比萨店的项目中。 我的比萨店由接待处(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;
}

但是,与此同时,我无法访问子进程的实例并调用该函数。有什么办法吗?

3 个答案:

答案 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()处理子进程。