Как дочерний процесс может сказать своему родителю создать нового ребенка?

Dears,

Я пишу приложение сетевого сервера с использованием C ++.

При запуске он создает сокет слушателя и определенное пользователем число дочерних процессов (рабочих), каждый из которых отслеживает слушателя (используя kqueue, epoll и т. Д.) Для новых клиентских соединений, accept()Обработка их и создание потока для обработки ответов. Как только рабочий дочерний процесс отвечает определенному пользователем количеству клиентских запросов, он должен указать родительскому процессу создать новый дочерний процесс, дождаться завершения всех потоков и затем завершиться.

У меня вопрос: есть ли у меня функция (create_child()) в моем родителе, который создает дочерний процесс, могу ли я просто вызвать его изнутри дочернего процесса и получить новый дочерний процесс родительского процесса (желаемый результат), или он создаст дочерний дочерний процесс? Ex. (Псевдо-код):

void create_child() {
//create child process
}

int main()
{
//do things

if(fork() == 0) {
//do things

create_child(); //is result a child of parent or child of child?
}
}

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

Извините, если это стало трудно понять, я немного засыпал, когда писал этот вопрос. Заранее спасибо за помощь.

1

Решение

Как правило, когда вы делаете forkи хотят общения между родителями & дочерние процессы (или между процессами вообще, если подумать), вы можете использовать труба:

    #include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

main()
{
int     fd[2];
pid_t   childpid;

pipe(fd);

if((childpid = fork()) == -1)
{
perror("fork");
exit(1);
}
.
.
}

Ребенок и родитель могут читать и писать, используя (сюрприз!) read а также write системные вызовы, используя fds. (Если общение должно быть односторонним, то fds должны быть закрыты, кстати.)

Когда у вас есть связь, вы можете разработать любой протокол, который вы хотите, чтобы ребенок общался с родителем, в том числе для охвата других процессов.

1

Другие решения

Чтобы ответить на 1-й вопрос: если вы развелись с ребенком, то у ребенка есть ребенок. Ваш начальный родительский процесс является прародителем этого последнего процесса.

Что еще более интересно, если первый дочерний элемент завершает работу, а второй дочерний процесс все еще работает — что и происходит в вашем текущем проекте — второй дочерний элемент становится сиротой и присоединяется к init. Ни один процесс не может иметь родителя. Первоначальный родительский процесс не может контролировать этого оставленного внучатым ребенком, которого только что усыновил init.

ответ на 2-й вопрос: нельзя.

Вы, вероятно, должны следить за детьми изнутри родителя. С вашим текущим дизайном, что, если ребенок умирает прежде, чем он может сказать родителю заменить его? или прежде чем он заменит себя?

это может быть отправной точкой:

for(int i=0;i<10;++i)
create_process();
for(;;) {
int status;
wait( &status );
create_process();
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector