当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何等待fork()调用的所有子进程完成?》经验,为你挑选了2个好方法。

我正在分配许多进程,我想测量完成整个任务所需的时间,即分叉完成所有进程的时间.请告知如何让父进程等到所有子进程终止?我想确保在合适的时刻停止计时器.

这是我使用的代码:

#include 
#include 
#include 
#include 
#include 

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 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 " <

Steve Jessop.. 22

我会在for循环之外的"else // parent"行之后移动所有内容.在forx循环之后,用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数组中查找并获取索引.



1> Steve Jessop..:

我会在for循环之外的"else // parent"行之后移动所有内容.在forx循环之后,用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数组中查找并获取索引.



2> gnud..:

最简单的方法是做

while(wait() > 0) { /* no-op */ ; }

如果wait()由于某些原因失败,除了没有孩子的事实之外,这将无效.因此,通过一些错误检查,这就变成了

int status;
[...]
do {
    status = wait();
    if(status == -1 && errno != ECHILD) {
        perror("Error during wait()");
        abort();
    }
} while (status > 0);

另请参见手册页wait(2).

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有