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

函数内fork()执行逻辑手动推导遇阻,请求代码解析帮助

分析含多fork()调用的C代码执行逻辑

原代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int Call_a_Function(int x, int y)
{
    x++;
    x = fork(); /* #4 */
    if (x)
    {
        x = y;
    }
    else if (fork()) /* #5 */
    {
        x--;
        y += x;
    }
    return x + y;
}
int main()
{
    int x, y = 5, z;
    x = fork(); /* #1 */
    if (x)
    {
        x = y;
        z = Call_a_Function(x, y++);
    }
    else
    {
        (void)fork(); /* #2 */
        z = x++;
        y += z;
    }
    if (y > z)
    {
        (void)fork(); /* #3 */
    }
    printf("%d ", x + y + z);
    return 0;
}

输出结果

21 6 6 6 16 16 6 14 14


逐分支分析进程与变量变化

1. 初始fork#1:生成2个进程

程序从main开始,执行x = fork(); /* #1 */后,分裂为父进程P1和子进程P2:

分支1:父进程P1(x为子进程PID,非0)

  • 执行x = y → x = 5
  • 执行z = Call_a_Function(x, y++):y++是后置递增,因此传给函数的y是5,执行完后main中的y变为6
  • 进入Call_a_Function(5,5)的执行:
    1. 初始x=5,执行x++ → x=6
    2. 执行fork(); /* #4 */,生成子进程P1-1:
      • P1(函数内父分支):x为子进程PID(非0),进入if(x)分支:x = y → x=5。返回x+y=5+5=10,因此main中z=10
        • 回到main后,变量为x=5, y=6, z=10
        • 检查y>z:6>10不成立,不执行fork#3
        • 计算输出:5+6+10=21
      • P1-1(函数内子分支):x=0,进入else if(fork()),执行fork(); /* #5 */生成子进程P1-1-1:
        • P1-1(fork#5父进程):fork返回非0,进入分支:x-- → x=-1;y +=x → y=5+(-1)=4。返回x+y=-1+4=3,因此main中z=3
          • 回到main后,变量为x=5, y=6, z=3
          • 检查y>z:6>3成立,执行fork#3生成子进程P1-1-2
            • P1-1输出:5+6+3=14
            • P1-1-2继承变量,输出:5+6+3=14
        • P1-1-1(fork#5子进程):fork返回0,不进入分支,直接返回x+y=0+5=5,因此main中z=5
          • 回到main后,变量为x=5, y=6, z=5
          • 检查y>z:6>5成立,执行fork#3生成子进程P1-1-1-2
            • P1-1-1输出:5+6+5=16
            • P1-1-1-2继承变量,输出:5+6+5=16

分支2:子进程P2(x=0)

  • 执行(void)fork(); /* #2 */,生成子进程P2-1:
    • P2(fork#2父进程):fork返回非0,继续执行:
      • z = x++ → z=0,x自增为1
      • y +=z → y=5+0=5
      • 变量为x=1, y=5, z=0
      • 检查y>z:5>0成立,执行fork#3生成子进程P2-2
        • P2输出:1+5+0=6
        • P2-2继承变量,输出:1+5+0=6
    • P2-1(fork#2子进程):fork返回0,继续执行:
      • z = x++ → z=0,x自增为1
      • y +=z → y=5+0=5
      • 变量为x=1, y=5, z=0
      • 检查y>z:5>0成立,执行fork#3生成子进程P2-1-2
        • P2-1输出:1+5+0=6
        • P2-1-2继承变量,输出:1+5+0=6

输出集合说明

进程调度顺序由操作系统决定,因此输出顺序可能变化,但所有进程的输出值固定为:21,14,14,16,16,6,6,6,6,与给定输出完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:41:00