如何从单个父进程创建指定数量n个子进程?循环fork生成进程数异常
问题原因
你写的循环会让所有已经创建的进程都执行fork操作,才会出现总进程数达到8个(减去初始父进程共7个子进程)的情况:
- i=0时,1个初始进程执行
fork,总进程数变为2 - i=1时,2个进程都执行
fork,总进程数变为4 - i=2时,4个进程都执行
fork,总进程数变为8
解决方法
核心逻辑是只让初始父进程执行fork操作,子进程创建成功后直接跳出循环/退出,不参与后续的fork,示例代码如下:
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() { const int CHILD_NUM = 3; // 需要创建的子进程数量 pid_t fork_ret; for (int i = 0; i < CHILD_NUM; i++) { fork_ret = fork(); if (fork_ret < 0) { perror("fork调用失败"); return 1; } else if (fork_ret == 0) { // 此处写子进程的业务逻辑 printf("第%d个子进程创建成功,进程ID:%d\n", i+1, getpid()); // 子进程执行完逻辑后直接退出,不进入下一轮循环 return 0; } // 父进程不做额外处理,进入下一轮循环创建下一个子进程 } // 父进程等待所有子进程退出,回收资源避免僵尸进程 for (int i = 0; i < CHILD_NUM; i++) { wait(NULL); } printf("所有子进程执行完毕,父进程退出\n"); return 0; }
补充说明
- 如果子进程不需要创建后立刻退出,也可以用
break跳出循环,只要保证子进程不会执行后续循环的fork即可 - 如果不需要等待子进程执行结果,也可以省略父进程的
wait逻辑,不过生产环境建议加上避免资源泄漏
内容的提问来源于stack exchange,提问作者Agrudge Amicus
相关产品推荐
相关产品推荐

