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

如何修改C语言fork代码实现多进程并行创建而非串行执行

问题根因

原代码串行执行的核心逻辑缺陷:第一次调用fork()生成第一个子进程后,父进程立刻进入wait()阻塞状态,必须等第一个子进程完全终止、资源被回收后,才会执行第二次fork()创建第二个子进程,两个子进程完全没有并行运行的时间窗口,总运行时长为两个子进程执行时间之和。

修改方案

要实现两个子进程并行执行,只需要调整fork和wait的调用顺序:

  • 连续完成两次fork()调用,先把两个子进程都创建出来,父进程在创建子进程的阶段不执行阻塞等待
  • 两个子进程全部创建完成后,父进程再统一调用wait()回收两个子进程的退出状态,避免产生僵尸进程
  • 单独存储两个子进程的PID,保证wait回收时能准确匹配到对应子进程,不会误回收其他进程
修改后可运行代码
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char * argv[]) {
  pid_t pid1, pid2;
  int status;

  // 创建第一个子进程
  pid1 = fork();
  if (pid1 == 0) {
    sleep(5);
    exit(5);
  }

  // 父进程不等待第一个子进程退出,立刻创建第二个子进程
  pid2 = fork();
  if (pid2 == 0) {
    sleep(1);
    exit(1);
  }

  // 两个子进程全部启动后,父进程统一回收资源
  while (pid1 != wait(&status));
  if (WIFEXITED(status)) {
    printf("第一个子进程退出,退出码:%d\n", WEXITSTATUS(status));
  }

  while (pid2 != wait(&status));
  if (WIFEXITED(status)) {
    printf("第二个子进程退出,退出码:%d\n", WEXITSTATUS(status));
  }

  return 0;
}
执行效果验证
  • 两个子进程创建后会并行执行:第二个子进程仅休眠1秒会先退出,第一个子进程休眠5秒后退出,程序总运行时长约5秒,比原串行逻辑的6秒总耗时更短
  • 父进程会正确回收两个子进程的资源,不会产生僵尸进程
  • 两个子进程的执行不存在先后依赖,完全符合并行运行的要求

注:常规编译命令gcc parallel_fork.c -o parallel_fork即可正常编译运行。

内容的提问来源于stack exchange,提问作者Dark Program

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.06 06:36:35