C语言 使用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
}

相关内容

  • 没有找到相关文章

最新更新