关于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); }
逐分支拆解:
初始父进程
初始状态:a=2,b=3。调用fork()后:- 父进程中
smith的值是新创建子进程的PID(大于0),进入else if分支 - 子进程中
smith=0,进入if分支
- 父进程中
父进程分支(smith>0)
- 执行
b++,此时b=4 - 调用
fork():创建一个新的子进程(记为子进程B) - 父进程和子进程B都会执行后续的
printf:- 父进程输出:
2 4 - 子进程B复制了父进程此时的状态(
a=2,b=4),输出:2 4
- 父进程输出:
- 执行
子进程分支(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
相关产品推荐
相关产品推荐

