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, чтобы написать простую программу и проверить, что происходит, но в своих поисках я где-то читал, что это создаст дочерний процесс. Так, как создать дочернего от родителя из другого ребенка?
Извините, если это стало трудно понять, я немного засыпал, когда писал этот вопрос. Заранее спасибо за помощь.
Как правило, когда вы делаете 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
системные вызовы, используя fd
s. (Если общение должно быть односторонним, то fd
s должны быть закрыты, кстати.)
Когда у вас есть связь, вы можете разработать любой протокол, который вы хотите, чтобы ребенок общался с родителем, в том числе для охвата других процессов.
Чтобы ответить на 1-й вопрос: если вы развелись с ребенком, то у ребенка есть ребенок. Ваш начальный родительский процесс является прародителем этого последнего процесса.
Что еще более интересно, если первый дочерний элемент завершает работу, а второй дочерний процесс все еще работает — что и происходит в вашем текущем проекте — второй дочерний элемент становится сиротой и присоединяется к init. Ни один процесс не может иметь родителя. Первоначальный родительский процесс не может контролировать этого оставленного внучатым ребенком, которого только что усыновил init.
ответ на 2-й вопрос: нельзя.
Вы, вероятно, должны следить за детьми изнутри родителя. С вашим текущим дизайном, что, если ребенок умирает прежде, чем он может сказать родителю заменить его? или прежде чем он заменит себя?
это может быть отправной точкой:
for(int i=0;i<10;++i)
create_process();
for(;;) {
int status;
wait( &status );
create_process();
}