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

关于fork()调用后子进程代码执行逻辑及示例代码的技术问询

关于fork()机制的两个疑问:执行范围与代码逻辑解析

一、子进程的代码执行范围

fork()的核心是复制当前进程(父进程)的完整状态,包括内存数据、寄存器、程序计数器(PC)等。关键规则是:

  • 父进程执行到fork()时,操作系统创建子进程,子进程的程序计数器会指向fork()调用的返回位置
  • 因此子进程不会从头执行整个程序,而是从fork()返回后,继续执行后续代码

举个例子:如果10行代码中第6行是fork(),父进程执行完第6行的fork()后,子进程会从第6行fork()的返回处开始,执行第7到第10行的代码,完全不会重复执行第1到第5行。

二、给定代码的运行逻辑解析

先把代码格式化如下:

int main(){
    pid_t smith;
    int a=2; int b=3;
    smith = fork();

    if(smith == 0){
        fork();
        a++;
        fork();
    }
    else if(smith > 0){
        b++;
        fork();
    }
    printf("%d %d\n",a,b);
}

逐分支拆解:

  1. 初始父进程
    初始状态:a=2,b=3。调用fork()后:

    • 父进程中smith的值是新创建子进程的PID(大于0),进入else if分支
    • 子进程中smith=0,进入if分支
  2. 父进程分支(smith>0)

    • 执行b++,此时b=4
    • 调用fork():创建一个新的子进程(记为子进程B)
    • 父进程和子进程B都会执行后续的printf:
      • 父进程输出:2 4
      • 子进程B复制了父进程此时的状态(a=2,b=4),输出:2 4
  3. 子进程分支(smith=0,记为子进程A)

    • 先调用第一个fork():创建子进程C,子进程A和C都会继续执行后续代码
    • 执行a++:子进程A和C的a都变为3
    • 调用第二个fork():子进程A创建子进程D,子进程C创建子进程E
    • 这四个进程(A、C、D、E)都会执行printf,它们的状态都是a=3,b=3(因为子进程A从未修改过b),所以都会输出:3 3

关键疑问解答:else if块中fork()创建的子进程执行哪些代码?

else if块里的fork()创建的子进程B,会从fork()的返回点开始执行——也就是跳过else if块的剩余代码(因为父进程已经执行完b++和fork()),直接执行fork()之后的printf语句。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:10:32