如何从分支中检索类的实例

How to retrieve instance of class from a fork?

本文关键字:实例 检索 分支      更新时间:2023-10-16

我目前正在做一个项目,我需要重新创建一个比萨店。我的比萨店由接待处(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()子进程。