【问题标题】:Forked 10 child processes, how can the parent process collect their return values?fork 10 个子进程,父进程如何收集它们的返回值?
【发布时间】:2016-05-01 14:56:40
【问题描述】:

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

有什么可以帮忙的吗?

【问题讨论】:

  • 多 t 标题会是更好的选择
  • 您反对为此使用线程吗?这会让事情变得容易一些。
  • 你可以添加一个全局数组 pidsresults[10] 然后让每个 pid 将其结果放在它自己的索引中吗?
  • @JohnZwinck 是的,我们只是在课堂上学习分叉,所以我不应该为此使用线程。
  • 所以不应该是家庭作业解决者,恕我直言。

标签: c process pipe fork wexitstatus


【解决方案1】:

您需要测试从 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;
    }

【讨论】:

  • 可以,但不幸的是返回值可能高于 127,甚至 255。
  • @Preno 那么请考虑我的其他答案。
【解决方案2】:

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

分叉进程之间共享内存解释得很好here

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

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

【讨论】:

  • 没有冒犯,但是将 SHM 设置为仅返回 0 到 100 之间的值的 10 倍似乎很安静...... ;-)
  • 同意。使用 fork 代替多线程也是大材小用,但这是一个学术练习,而不是生产代码的优化问题。
猜你喜欢
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
相关资源
最近更新 更多