使用 pipe() 从多个子进程中读取?

Reading from multiple child processes with pipe()?

我有一大块代码,我试图将一个问题拆分成 N 个子问题,跨 N 个子进程,让每个进程处理它给定的子问题,然后通过管道将结果合并回来。

每个子问题的解决方案的大小都是预先知道的,以 int 数组的形式。

问题似乎是子问题的解决方案没有被主进程读入。之后尝试访问读入的数据会得到 NULL pointer error。我觉得可能是因为子进程在读入数据前就退出了,但是我自己的实验一直无法验证。

我使用的代码大致如下所示

  int** child_pipes = init_child_pipes(process_cnt);
  int* solution_sizes = get_solution_sizes(...);
  pid_t children[process_cnt];
  for (int i = 0; i < process_cnt; i++) {
    if ((children[i] = fork()) == 0) {
      // close all unused pipes for this child process
      for (int j = 1; j < process_cnt; j++) {
        close(child_pipes[j][0]); 
        if (i != j)
          close(child_pipes[j][1]);
      }

      int* solution = do_subproblem(...)
      int c = write(child_pipes[i][1], solution, solution_sizes[i]);
      close(child_pipes[i][1]);
      exit(0); // exit so no loop
    }
    else if (children[i] < 0) { // child < 0
      fprintf(stderr, "failed to create child processes");
      exit(1);
    }
  }

  // wait on children
  int status;
  for (int i = 0; i < process_cnt; i++) 
    waitpid(children[i], &status, 0);

  // merge cells
  int** all_subproblems = malloc(sizeof(int*) * process_cnt);
  for (int i = 0; i < process_cnt; i++) {
    close(child_pipes[i][1]); // close writing end
    read(child_pipes[i][0], &all_subproblems[i], solution_sizes[i]);
    close(child_pipes[i][0]); // close read end
  }

我不确定我是否在这里错误地使用了 fork()pipe(),但这很可能就是问题所在。任何帮助将不胜感激!

您还没有为 all_subproblems 的每个元素分配内存以指向。

使用malloc()分配此内存。而read()的参数应该是数组元素,而不是数组元素的地址。

  // merge cells
  int** all_subproblems = malloc(sizeof(int*) * process_cnt);
  for (int i = 1; i < process_cnt; i++) {
    close(child_pipes[i][1]); // close writing end
    all_subproblems[i] = malloc(subproblem_sizes[i]);
    read(child_pipes[i][0], all_subproblems[i], subproblem_sizes[i]);
    close(child_pipes[i][0]); // close read end
  }