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

Unix编程fork()调用后子进程为何会执行printf语句?

问题核心误区说明

你之前学到的「子进程仅会执行fork()调用之后的代码」这个结论完全正确,出现认知偏差的核心原因是你搞错了C语言函数参数的求值顺序。

C语言标准规定,函数调用的所有参数会在进入函数体之前完成求值,你写的printf("%d ", fork());语句的实际执行流程是:

  1. 先执行参数列表中的fork()系统调用
  2. fork()执行完成后,操作系统会创建出完全独立的父子两个进程:父进程中fork()返回子进程的PID(你示例中的9298),子进程中fork()返回0
  3. 此时两个进程都会继续完成后续的逻辑,也就是把各自拿到的fork()返回值作为参数传入printf()执行打印操作

等价代码对比

你写的代码和下面这种写法的执行逻辑完全一致,拆分之后就能很直观理解输出结果的来源:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    pid_t fork_ret = fork();
    printf("%d ", fork_ret);
    return 0;
}

两个进程各自执行fork()之后的printf语句,自然就会输出两个数值,和你实际运行得到的结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:06