You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:54:05