2016-02-02 3 views
1

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, чтобы написать простую программу и проверить, что происходит, но в моих поисках я где-то читал, что он создаст дочерний процесс дочернего процесса. Итак, Как создать ребенка родителя из другого ребенка?

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

+0

Если вилка() вернула 0, вы уже в дочернем процессе, когда вы получаете вашу функцию create_child.Этот процесс является дочерним процессом, который называется fork. Исходный родительский процесс не имеет особого значения и не отслеживается fork. – Donnie

+0

Что еще будет делать родительский процесс? Почему бы родительский процесс не наблюдал за завершением работы с дочерним элементом и не создал новый ребенок? – Beta

+0

@ Donnie, я это знаю. То, что я хочу, - это какой-то способ, изнутри дочернего элемента (после fork() == 0), сообщить родителям о создании нового ребенка. –

ответ

1

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

#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 должны быть закрыты, кстати.)

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

+0

Кажется, что я решил свою проблему, но я хочу, чтобы избежать труб, чтобы избавиться от дополнительных накладных расходов и работы для ОС (потребуется труба мониторинга kqueue/epoll, я прочитал кое-что о системе, которая должна поддерживать синхронизацию труб ...), поскольку производительность является критическим моментом для этого приложения ... –

+1

Я думаю, вы будете удивлены. Профиль, чтобы увидеть, добавляет ли вызов трубки, чтобы фактически запустить новый процесс, на самом деле имеет значение. Я готов поспорить вам чашку кофе (не знаю, как сделать логистику на этом, хотя) - это не будет. :-) Не забывайте - преждевременная оптимизация - корень всего зла. –

1

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

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

ответ на второй вопрос: вы не можете.

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

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

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

Мониторинг детей (для их выхода) изнутри родительского процесса не решает всей проблемы, так как ребенок собирается сообщить родителям о создании нового ребенка еще до его выхода. Спасибо, в любом случае, ваш ответ напомнил мне о добавлении мониторинга количества запросов 'accept()' запросов рабочих, поскольку некоторые из них могут неожиданно выйти из-за неперехваченного исключения или чего-то еще, прежде чем сообщать родителям о его замене. –

Смежные вопросы