0

我必须在包含 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 我完全迷路了。

有什么办法可以帮忙吗?

4

2 回答 2

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;
    }
于 2016-05-01T15:46:44.510 回答
0

您需要测试从 fork 返回的 pid,并分支您的代码,这样您的主进程就不会像孩子一样,并且您的孩子不会产生自己的孩子。一旦处理好...

在分叉进程之间共享内存在这里解释得很好

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

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

于 2016-05-01T15:26:50.330 回答