fork — асинхронное межпроцессное управление c ++

Я пишу это с помощью C ++ на Ubuntu 12.04 LTS, и я явно не использую никаких библиотек BOOST.
Я хочу, чтобы у меня был родительский процесс и два или более дочерних процесса одновременно.

Родительский процесс действует как прослушиватель событий и диспетчер задач. Дети справляются с задачами, которые им поручают родители; эти задачи являются системными вызовами, и родителю все равно, когда они завершатся.

То, что я сделал до сих пор успешно,

  • parent будет выполнять fork () некоторых детей и сохранять их pids
  • дети отстранены (S) сразу после того, как fork () с pause ()
  • родитель возобновляет (R) и обнаруживает события в стандартном цикле событий

Далее мне нужно знать, как возобновить работу ребенка и вернуться к родителю, пока ребенок еще работает.

Таким образом, мои вопросы таковы: могут ли родитель и ребенок работать одновременно и безопасно таким образом? (где родителю все равно, что делает ребенок после его возобновления)

Что мне нужно сделать, чтобы возобновить дочерний процесс после pause ()?

ниже функция конструктора, которая разветвляет детей

childManager(int number_of_children, pid_t parent) {
int i=0;

while(number_of_children--) {
if(parent == getpid())
{
this->parent = parent;
children.push_back({++i,_IDLE,fork()});
if(parent != getpid()) pause();
}
}
}

0

Решение

Единственный вопрос, который я вижу здесь,

Что мне нужно сделать, чтобы возобновить дочерний процесс после pause ()?

Отправьте ему сигнал, действие которого состоит в том, чтобы либо выполнить функцию перехвата сигнала, либо завершить процесс. Например:

kill(children[i], SIGUSR);

Тем не менее, это далеко не идеальный способ сделать это. С таким же успехом можно было бы заблокировать дочерние блоки на конвейере, ожидая, когда родитель скажет им что-то сделать. Или около 30 подобных вещей, которые не связаны с сигналами.

1

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

Чтобы ответить на ваши конкретные вопросы:

Таким образом, мои вопросы таковы: могут ли родитель и ребенок работать одновременно и безопасно таким образом? (где родителю все равно, что делает ребенок после его возобновления)

Родительский процесс должен будет вызвать Подождите или же waitpid собирать дочерние процессы после их выхода. Если вы этого не сделаете, вы останетесь с зомби-процессами. Вы можете сделать это неблокирующим способом внутри вашего цикла событий в родительском процессе.

Что мне нужно сделать, чтобы возобновить дочерний процесс после pause ()?

Вы должны отправить сигнал дочернему процессу. Вы делаете это по телефону убийство в родительском процессе. Вам нужно будет установить обработчик сигнала в дочернем процессе, чтобы перехватить сигнал — используйте sigaction для этого.

0

По вопросам рекламы [email protected]