为何fork生成10个进程输出10次而非7次?进程数量计算解析
进程数量计算逻辑分析
代码回顾
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(){ int pid = fork(); fork(); if (pid == 0) { fork(); fork(); } printf("process ID: %d\n", getpid()); return 0; }
进程生成分步解析
我们从初始进程(记为P0)开始,逐行分析fork()调用的影响:
1. 第一次fork():int pid = fork();
P0调用fork(),生成子进程P1。P0中,pid被赋值为P1的进程ID(非0);P1中,pid被赋值为0。- 当前总进程数:2(
P0、P1)
2. 第二次fork():fork();
- 当前存在的2个进程(
P0、P1)都会执行这个fork():P0生成子进程P2,P2继承P0的pid值(非0);P1生成子进程P3,P3继承P1的pid值(0)。
- 当前总进程数:2 + 2 = 4(
P0、P1、P2、P3)
3. if (pid == 0)分支内的两次fork()
只有pid值为0的进程会进入这个分支,也就是P1和P3(P0、P2的pid非0,跳过分支)。我们分别分析这两个进程的执行:
针对P1的两次fork()
- 第一次
fork():P1生成子进程P4,总进程数变为4 + 1 = 5。 - 第二次
fork():此时P1和P4都会执行这个fork(),各自生成子进程P5、P6,总进程数增加2,变为5 + 2 = 7。
针对P3的两次fork()
- 第一次
fork():P3生成子进程P7,总进程数变为7 + 1 = 8。 - 第二次
fork():此时P3和P7都会执行这个fork(),各自生成子进程P8、P9,总进程数增加2,变为8 + 2 = 10。
最终进程数
所有10个进程都会执行后续的printf,因此输出10次。
为什么不是7个?
你可能误以为只有初始的几个进程会执行分支内的fork(),但忽略了每次fork()生成的子进程会继承父进程的执行状态:
- 分支内的每次
fork(),不仅父进程会继续执行后续代码,新生成的子进程也会执行剩下的fork()调用。 - 比如
P1第一次fork()生成P4后,P4也会执行分支内的第二个fork(),这会额外增加进程数,这是容易被忽略的点。
内容的提问来源于stack exchange,提问作者Yaman BH
相关产品推荐
相关产品推荐

