c++ - 如何等待 fork() 调用的所有子进程完成?

标签 c++ linux gcc parallel-processing

我正在 fork 多个进程,我想测量完成整个任务需要多长时间,即所有 fork 的进程都完成的时间。请告知如何使父进程等到所有子进程终止?我想确保在正确的时刻停止计时器。

这是我使用的代码:

#include <iostream>
#include <string>
#include <fstream>
#include <sys/time.h>
#include <sys/wait.h>

using namespace std;

struct timeval first,  second,  lapsed;
struct timezone tzp; 

int main(int argc, char* argv[])// query, file, num. of processes.
{

    int pCount = 5; // process count

    gettimeofday (&first, &tzp); //start time

    pid_t* pID = new pid_t[pCount];

    for(int indexOfProcess=0; indexOfProcess<pCount; indexOfProcess++)
    {
        pID[indexOfProcess]= fork();

        if (pID[indexOfProcess] == 0)                // child
        {
            // code only executed by child process

            // magic here

            // The End
            exit(0);
        }
        else if (pID[indexOfProcess] < 0)    // failed to fork
        {
            cerr << "Failed to fork" << endl;
            exit(1);
        }
        else                         // parent
        {
            // if(indexOfProcess==pCount-1) and a loop with waitpid??

            gettimeofday (&second, &tzp); //stop time
            if (first.tv_usec > second.tv_usec)
            {
                second.tv_usec += 1000000;
                second.tv_sec--;
            }

            lapsed.tv_usec = second.tv_usec - first.tv_usec;
            lapsed.tv_sec = second.tv_sec - first.tv_sec; 

            cout << "Job performed in " <<lapsed.tv_sec << " sec and " << lapsed.tv_usec    << " usec"<< endl << endl;

        }

    }//for

}//main

最佳答案

我会将 "else//parent"行之后的所有内容移到 for 循环之外。在 fork 循环之后,使用 waitpid 执行另一个 for 循环,然后停止时钟并执行其余操作:

for (int i = 0; i < pidCount; ++i) {
    int status;
    while (-1 == waitpid(pids[i], &status, 0));
    if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
        cerr << "Process " << i << " (pid " << pids[i] << ") failed" << endl;
        exit(1);
    }
}

gettimeofday (&second, &tzp); //stop time

我假设如果子进程未能正常退出,状态为 0,那么它没有完成它的工作,因此测试未能产生有效的计时数据。显然,如果子进程应该被信号杀死,或者退出非 0 返回状态,那么你必须相应地更改错误检查。

另一种使用等待的方法:

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) {
            cerr << "pid " << done << " failed" << endl;
            exit(1);
        }
    }
}

这个并没有告诉你顺序是哪个进程失败了,但如果你关心的话,你可以添加代码在 pids 数组中查找它并取回索引。

关于c++ - 如何等待 fork() 调用的所有子进程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/279729/

相关文章:

c++ - 通过 QI 或继承实现 IUnknown 相等的区别

linux - python 有没有办法知道我的系统中所有已安装的应用程序的版本(Windows 和 Linux 都是)?

c++ - 如何使用多个版本的 GCC

c++ - C++中的简单探路者

c++ - MFC ctrls 和重复消息

linux - Bash PS1 为 root 显示 $ 而不是 #

linux - 您将哪些 Alt.Net 解决方案移植到了 Mono/Linux?

c++ - 为什么未初始化的 constexpr 变量不是常量?

c++ - 如何在 C++ 中使用 C 空括号函数?

c++ - 查找函数在内存中的地址