Ожидание дочерних процессов - PullRequest
1 голос
/ 24 августа 2010

Я пробую дочерние процессы 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: Все началось Дистрибьютор Подсистем Иннит

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

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

0 голосов
/ 24 августа 2010

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

    int errno;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...