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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:47:42