等待子进程

发布于 2024-09-15 13:45:24 字数 1922 浏览 4 评论 0原文

我尝试 fork 子进程并等待它们死亡。我首先 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

I try fork child processes and wait them to die.I first fork N child processes and then wait in a loop. But it seems it doesn't wait the child processes to die.It exits the loop altough the childs do not die. Here's my code:

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");
}

Here's the output:

PID=7311
ThriftDistributor instance start:
PID=7312
ThriftDistributor instance start:
All started
Distributor Subsytem uninit

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

在风中等你 2024-09-22 13:45:24

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

you created one more child by calling "pid = fork();" in the default section of the "switch". this child will reach the wait() function call and will definitely break and exit.
The real parent process will keep on running till all the children exit.

罪#恶を代价 2024-09-22 13:45:24

您不应该在函数中像这样声明errno

    int errno;

而是包含头文件 errno.h (不过不确定这是否会给您带来麻烦)。

You shouldn't declare errno like this in a function.

    int errno;

Include the header file errno.h instead (not sure if this is causing your troubles though).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文