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

关于fork()函数创建6个子进程及代码中数字1打印次数的疑问

问题解答

一、为什么数字1会被打印7次?

先明确几个关键前提:

  • fork()调用后,父进程返回子进程PID(非0整数),子进程返回0;
  • |是按位或运算符,非短路逻辑或||,左右两侧的fork()都会执行;
  • printf("i: %d\n",i)中的\n会刷新输出缓冲区,子进程不会继承未刷新的输出,不会重复打印i:0。

i=0循环后的进程数量:

初始进程记为P0:

  1. P0打印i: 0,缓冲区刷新。
  2. 执行第一个fork():创建子进程P1。P0得到非0返回值,P1得到0。
  3. 执行第二个fork()(因|非短路,P0和P1都会执行):
    • P0创建子进程P2,得到非0返回值;
    • P1创建子进程P4,得到非0返回值,P4得到0。
  4. 条件判断f1 | f2:
    • P0:非0 | 非0 = 非0 → 执行fork(),创建P3;
    • P1:0 | 非0 = 非0 → 执行fork(),创建P5;
    • P2:继承P0的第一个fork()非0返回值,自身第二个fork()返回0 → 非0 | 0 = 非0 → 执行fork(),创建P6;
    • P4:0 | 0 = 0 → 不执行fork()。

此时系统中存在7个进程:P0、P1、P2、P3、P4、P5、P6。进入i=1循环时,这7个进程都会执行printf("i: %d\n",i),各自打印一次i: 1,总计7次。

二、父进程(初始进程P0)为何创建6个子进程?

初始进程P0在两次循环中各创建3个子进程,累计6个:

  1. i=0循环:
    • 第一个fork()创建P1;
    • 第二个fork()创建P2;
    • 条件为真时的fork()创建P3;
  2. i=1循环:
    • 第一个fork()创建P7;
    • 第二个fork()创建P8;
    • 条件为真时的fork()创建P9;

你之前的误解在于忽略了|的非短路特性,以及初始进程会在两次循环中完整执行fork()逻辑,而非仅在第一次循环创建所有子进程。

内容的提问来源于stack exchange,提问作者Thatoneguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:52:03