Как получить экземпляр класса из вилки? - PullRequest
3 голосов
/ 27 апреля 2019

В настоящее время я работаю над проектом, в котором мне нужно воссоздать пиццерию.Моя пиццерия состоит из приемной (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;
}

Но при этом я не могу получить доступ к экземпляру моего дочернего процесса и вызвать функцию.Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 27 апреля 2019

Это не работает таким образом.

Вы отключили новый дочерний процесс, который, в свою очередь, создает экземпляр newKitchen и добавляет его к myVector.Тем временем родительский процесс сделал то же самое.Теперь у вас есть два разных процесса.Или, если говорить более абстрактно, - две идентичные пиццерии - каждая со своей кухней - обе работают независимо.

Я предполагаю, что это академическое упражнение, но я подозреваю, что вам нужен какой-то механизм передачи сообщений или механизм IPC, с помощью которого дочерний процессвладеет новым кухонным объектом, а родительский процесс отправляет команды или сообщения дочернему процессу для имитации «заказов», отправляемых на кухню.Google для Linux message queues.Один результат здесь

Я предполагаю, что вы используете вилку по какой-то причине (академическое упражнение?).В противном случае, лучший и более простой способ выполнить это моделирование - использовать потоки вместо процессов.Или еще лучше, просто держите все это однопоточным.

1 голос
/ 27 апреля 2019

Общий, а скорее конкретный и конкретный ответ:

Процессы операционной системы не могут обмениваться данными на уровне абстракции экземпляров классов и их методов (по крайней мере - не экземпляры и методы, разработанные вами в приложении).).И - у отдельных процессов есть отдельное пространство памяти (в отличие от потоков, кстати).Таким образом, ваш ресепшн не сможет напрямую работать с какими-либо предметами кухни.Вам придется либо использовать какой-либо протокол межпроцессного взаимодействия (например, с использованием каналов или сообщений), либо, если ваша ОС поддерживает его, - использовать буфер межпроцессной совместной памяти.Даже это не будет похоже на доступ к пространству памяти Кухни, поэтому вам нужно быть осторожным.

0 голосов
/ 27 апреля 2019

Вам необходимо использовать разделяемую память. UNIX-подобные системы имеют <sys/shm.h>, но есть также библиотека повышения , которую вы можете использовать. Другой вариант - использовать std::thread s вместо fork() ing дочерних процессов.

...