fork()如何停止创建子进程?循环fork代码是否会陷入无限创建?
关于fork()创建子进程的停止逻辑及代码分析
一、fork()如何停止创建子进程?
fork()系统调用最关键的特性是一次调用,两次返回:
- 在父进程中,
fork()会返回新创建子进程的PID(一个大于0的整数) - 在子进程中,
fork()会返回0
要让子进程停止创建新进程,核心就是利用这个返回值做分支判断:让子进程在执行完自身任务后直接退出(比如调用exit()),或者跳过后续的fork()调用逻辑。简单来说,只要子进程不再主动调用fork(),就不会继续生成新的子进程了。
二、你的代码会不会创建大量子进程并陷入循环?
先看你给出的代码片段:
int pids[N]; for(int i = 0; i < N; i++){ pids[i] = fork(); if(pids[i]==0){ //do something break; } }
结论是:不会陷入循环,最终只会创建N个子进程,具体逻辑拆解如下:
- 初始只有1个父进程,进入循环后,每次
fork()会生成一个子进程:- 父进程中
pids[i]是子进程的PID(大于0),不会触发break,会继续完成剩下的循环迭代,直到i从0到N-1,总共执行N次fork(),创建N个子进程。 - 每个子进程中
pids[i]等于0,会立即执行break跳出循环,不会继续执行后续的循环迭代(也就是不会再调用fork())。每个子进程只会停留在当前i的循环步骤,不会继续创建新的子进程。
- 父进程中
举个直观的例子,假设N=2:
- 父进程在i=0时调用
fork(),生成子进程A;父进程继续循环,子进程A执行break退出循环。 - 父进程在i=1时调用
fork(),生成子进程B;父进程完成循环,子进程B执行break退出循环。
最终会有1个父进程 + 2个子进程,总共3个进程,完全没有循环创建的问题。
内容的提问来源于stack exchange,提问作者Flama
相关产品推荐
相关产品推荐

