函数内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)的执行:- 初始
x=5,执行x++→x=6 - 执行
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输出:
- 回到
- 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
- P1-1-1输出:
- 回到
- P1-1(fork#5父进程):
- P1(函数内父分支):
- 初始
分支2:子进程P2(x=0)
- 执行
(void)fork(); /* #2 */,生成子进程P2-1:- P2(fork#2父进程):
fork返回非0,继续执行:z = x++→z=0,x自增为1y +=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输出:
- P2-1(fork#2子进程):
fork返回0,继续执行:z = x++→z=0,x自增为1y +=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
- P2-1输出:
- P2(fork#2父进程):
输出集合说明
进程调度顺序由操作系统决定,因此输出顺序可能变化,但所有进程的输出值固定为:21,14,14,16,16,6,6,6,6,与给定输出完全匹配。
内容的提问来源于stack exchange,提问作者Leo Rigasaki
相关产品推荐
相关产品推荐

