分叉10个子进程,父进程如何收集其返回值?

时间:2016-05-01 14:56:40

标签: c process pipe fork wexitstatus

我必须在包含10个子进程的1000个数字的数组中找到最大值(因此每个进程只检查一百个值),并且父进程只需要收集数据。 我已经完成了所有事情,但我仍然坚持阅读这些价值观。

以下是代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(){
    int array[1000];
    int i, j;
    int pids[10];
    int searchminindex;
    int searchmaxindex;
    int maxindex;

    srand(time(NULL));

    //fill up array with random numbers
    for(i = 0; i < 1000; i++)
    {
            tomb[i] = random() % 5000;
    }

    //create 10 child processes
    for (i = 0; i < 10; i++) {
            if ((pids[i] = fork()) < 0) {
                    perror("fork");
                    abort();
            }
            else if (pids[i] == 0) {
                    searchminindex = i * 100;
                    searchmaxindex = (i+1) * 100;

                    //finding the biggest value
                    maxindex = searchminindex;
                    for(j = searchminindex+1; j < maxindex; j++) {
                            if( array[maxindex] < array[j])
                                    maxindex = j;
                    }
            }

    }
    for(i = 0; i < 10; i++){
        //here's where I'd read the return values of the subarrays
    }

    return 0;
}

我尝试过使用烟斗并使用WEXITSTATUS,但我真的很困惑,并且不知道在哪里关闭管道的一端以及类似的东西,以及WEXITSTATUS I&#39 ; m完全迷失了。

你能以任何方式提供帮助吗?

2 个答案:

答案 0 :(得分:0)

你需要测试从fork返回的pid,并对你的代码进行分支,这样你的主进程就不会像孩子一样,所以你的孩子不会产生自己的孩子。一旦得到照顾......

分叉进程之间共享内存的解释here

我会使用mmap在进程之间创建共享内存,您需要为每个进程指定放置结果的位置,然后使用wait确定所有子进程何时退出,以及一个好的程序会评估退出状态,并告知用户是否有任何孩子异常退出。

不要忘记在父出口之前清理共享内存。

答案 1 :(得分:0)

你需要测试从fork返回的pid,并对你的代码进行分支,这样你的主进程就不会像孩子一样,所以你的孩子不会产生自己的孩子。一旦得到照顾......

mmap或设置共享内存的替代方法是使用WEXITSTATUS。根据手册页,它只会返回最低8位,所以如果你的返回值可能大于127,这可能不是你最好的选择。最多可以工作255,但要注意char的签名,这不是标准。

int returned_values[10];
for(int i = 0; i < 10; ++i)
{
    int status;
    wait(&status);
    if(WIFEXITED(status))
        returned_values[i] = WEXITSTATUS(status);
    else {
        //Do something more meaningful here
        //This means a child received a signal, or any of the other ways wait returns other than a child exiting.
        --i;
    }