C语言中子进程如何将计算得到的数值返回给主进程
C语言子进程向主进程返回计算结果的实现方法
下面是4种适合当前场景的常用实现方案:
1. 管道(pipe)
无名管道是亲缘进程通信最常用的方案,实现简单且无结果大小限制。如果有多个子进程,父进程可以提前创建对应数量的管道,每个子进程使用独立的管道传输结果,避免数据混乱。
核心代码示例:
// 父进程先创建管道 int fd[2]; pipe(fd); pid_t pid = fork(); if (pid == 0) { // 子进程逻辑:关闭不需要的读端,计算完成后写入结果 close(fd[0]); long sum = 你的文件求和计算结果; write(fd[1], &sum, sizeof(sum)); close(fd[1]); exit(0); } else { // 父进程逻辑:关闭不需要的写端,读取子进程返回的结果 close(fd[1]); long res; read(fd[0], &res, sizeof(res)); close(fd[0]); // 后续处理结果的逻辑 }
2. 共享内存(shm)
共享内存是性能最高的IPC方案,适合子进程数量多、计算结果大的场景。父进程提前申请一块大小匹配的共享内存,每个子进程写入自己对应偏移位置的内存空间,所有子进程退出后父进程可以直接读取全部结果。如果每个子进程的写入位置完全独立,不需要额外加同步机制。
核心代码示例:
// 父进程提前申请共享内存,大小为 子进程数量 * 结果变量大小 int shmid = shmget(IPC_PRIVATE, child_cnt * sizeof(long), 0666 | IPC_CREAT); long *shm_buf = shmat(shmid, NULL, 0); // 子进程逻辑,假设当前子进程编号为 idx long sum = 你的文件求和计算结果; shm_buf[idx] = sum; shmdt(shm_buf); exit(0); // 父进程等待所有子进程退出后,直接读取 shm_buf 数组即可得到所有子进程的结果
3. exit() 进程退出返回值
仅适合计算结果在0~255区间的场景,子进程可以直接把结果作为exit()的入参返回,父进程通过waitpid的返回状态提取结果,代码量最小。注意超出255的结果会溢出,不推荐大数求和使用。
核心代码示例:
pid_t pid = fork(); if (pid == 0) { int sum = 你的文件求和计算结果; // 必须在0~255范围内 exit(sum); } else { int status; waitpid(pid, &status, 0); int res = WEXITSTATUS(status); }
4. 消息队列
消息队列支持带消息标识的异步通信,父进程可以按标识匹配对应子进程的结果,不需要按照子进程启动顺序接收结果,适合子进程执行时间差异大、完成顺序不确定的场景。
选型建议
- 求和结果较大、子进程数量多:优先选择共享内存,性能最优
- 追求实现简单、结果大小无限制:优先选择管道,代码逻辑简单,不容易出现同步问题
- 计算结果稳定在0~255区间:可以直接使用
exit()返回值,代码量最小
内容的提问来源于stack exchange,提问作者user16438868
相关产品推荐
相关产品推荐

