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

C语言中fork()的打印行为疑问:为何输出结果为4?

代码输出4的原因及进程生命周期分析

先看原代码:

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

int main() {
    int i, status;
    int x =1;
    for ( i = 0; i < 3; i++) {
        int pid = fork();
        x++;
        if (pid > 0) {
            wait(&status);
            x--;
            exit(-1);
        }
    }

    printf ("x = %d\n", x);
    return 0;
}

执行流程拆解

初始时只有主进程(记为P0),x=1,进入循环:

  1. i=0(P0执行)

    • P0调用fork()生成子进程P1,此时P0和P1的x都是1,随后各自执行x++,x变为2。
    • P0中pid是P1的进程ID(大于0),调用wait(&status)阻塞,等待P1结束。
    • P1中pid=0,继续循环,i变为1。
  2. i=1(P1执行)

    • P1调用fork()生成子进程P2,P1和P2的x都是2,各自执行x++后,x变为3。
    • P1中pid>0,调用wait(&status)阻塞,等待P2结束。
    • P2中pid=0,继续循环,i变为2。
  3. i=2(P2执行)

    • P2调用fork()生成子进程P3,P2和P3的x都是3,各自执行x++后,x变为4。
    • P2中pid>0,调用wait(&status)阻塞,等待P3结束。
    • P3中pid=0,继续循环,i变为3,此时i<3不成立,退出循环。
  4. 最终输出

    • P3退出循环后,执行printf("x = %d\n", x),输出x=4,随后return 0正常退出。
    • P3结束后,P2的wait()返回,执行x--(x变为3),调用exit(-1)退出。
    • P2结束后,P1的wait()返回,执行x--(x变为2),调用exit(-1)退出。
    • P1结束后,P0的wait()返回,执行x--(x变为1),调用exit(-1)退出。

进程结束时机总结

  • P3:循环结束后执行打印,随后return 0正常退出。
  • P2:等待P3完全结束后,执行x--,调用exit(-1)退出。
  • P1:等待P2完全结束后,执行x--,调用exit(-1)退出。
  • P0:等待P1完全结束后,执行x--,调用exit(-1)退出。

只有P3会走到printf语句,所以最终输出是4。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:32:14