如何修改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
相关产品推荐
相关产品推荐

