Я пробую дочерние процессы fork и жду их смерти. Сначала я делаю N дочерних процессов, а затем ожидаю в петля. Но кажется, что дочерние процессы не ждут смерти. Он выходит из цикла, хотя дочерние процессы не умирают. Вот мой код:
void DistributorSubsystem::Start()
{
Application::instance().logger().information("Distributor Subsytem start");
//start all the distributors
pid_t pid = fork();
pid_t p;
for (size_t i=0;i<_distributors.size();++i)
{
switch(pid)
{
case -1:
perror("fork");
exit(-1);
case 0:
p = getpid();
printf("PID=%d\n", p);
_distributors[i]->Start();
Application::instance().logger().information("End of child");
exit(0);
default:
pid = fork();
}
}
int errno;
//wait for child processes to die
while (true)
{
int status;
pid_t done = wait(&status);
if (done == -1)
{
if (errno == ECHILD) break; // no more child processes
}
else
{
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
{
std::stringstream s;
s<<done;
Application::instance().logger().error("pid " + s.str() + " failed");
exit(-1);
}
}
}
Application::instance().logger().information("All started");
}
Вот вывод:
PID = 7311 Запуск экземпляра ThriftDistributor: PID = 7312 Запуск экземпляра ThriftDistributor: Все началось Подсистема распространителя uninit
Вы не должны объявлять errno
как это в функции.
int errno;
Вместо этого включите файл заголовка errno.h
(хотя не уверен, что это вызывает у вас проблемы).
вы создали еще одного дочернего элемента, вызвав "pid = fork();" в стандартном разделе «переключатель». этот потомок достигнет вызова функции wait() и обязательно сломается и выйдет. Настоящий родительский процесс будет продолжать работать до тех пор, пока не закончатся все дочерние процессы.