Ожидание дочерних процессов

Я пробую дочерние процессы 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

1
задан mathk 24 August 2010 в 08:26
поделиться

2 ответа

Вы не должны объявлять errno как это в функции.

    int errno;

Вместо этого включите файл заголовка errno.h (хотя не уверен, что это вызывает у вас проблемы).

0
ответ дан 2 September 2019 в 21:54
поделиться

вы создали еще одного дочернего элемента, вызвав "pid = fork();" в стандартном разделе «переключатель». этот потомок достигнет вызова функции wait() и обязательно сломается и выйдет. Настоящий родительский процесс будет продолжать работать до тех пор, пока не закончатся все дочерние процессы.

2
ответ дан 2 September 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: