等待孩子的过程

时间:2010-08-24 08:16:55

标签: c++ linux process

我尝试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实例启动: 全部开始了 经销商Subsytem uninit

2 个答案:

答案 0 :(得分:2)

通过调用“pid = fork();”创建了另外一个孩子在“开关”的默认部分。这个孩子将到达wait()函数调用,肯定会破坏并退出。 真正的父进程将继续运行直到所有孩子退出。

答案 1 :(得分:0)

您不应在函数中声明errno这样的内容。

    int errno;

包含头文件errno.h(不确定这是否会导致您的麻烦)。