为何调用fork()的代码输出20次YES?求解析fork执行次数
代码中fork()执行次数分析
先明确两个关键前提:
fork()调用后,父进程返回子进程的PID(非0,布尔逻辑中视为真),子进程返回0(布尔逻辑中视为假);- C语言的短路求值规则:
&&左侧为真才执行右侧,左侧为假则跳过右侧;||左侧为真则跳过右侧,左侧为假才执行右侧。
逐行分析fork()执行次数
第4行:fork();
初始只有1个进程,执行这次fork后,产生1个新进程,总进程数变为2。
- 本次fork执行次数:1次。
第5行:fork() && fork()||fork();
当前有2个进程,每个进程执行这一行的逻辑完全一致,先分析单个进程的执行路径:
- 执行第一个
fork()(记为F1):- 父进程(原进程)得到非0值,继续执行
&&右侧的第二个fork()(F2); - 子进程(F1创建)得到0值,跳过
&&右侧的F2,直接执行||右侧的第三个fork()(F3)。
- 父进程(原进程)得到非0值,继续执行
- 父进程执行F2:
- 父进程得到非0值,
F1&&F2结果为真,跳过||右侧的F3; - 子进程(F2创建)得到0值,
F1&&F2结果为假,执行||右侧的F3。
- 父进程得到非0值,
单个进程执行这一行时,会触发4次fork:F1、F2、F1子进程的F3、F2子进程的F3。
2个进程执行这一行,总共触发2×4=8次fork,执行完成后总进程数变为2×5=10(每个原进程执行完这一行后会变成5个进程)。
第6行:fork();
当前有10个进程,每个进程都会执行这次fork,每个fork产生1个新进程,总共触发10×1=10次fork,执行完成后总进程数变为20。
总fork()执行次数
将三次的次数相加:1 + 8 + 10 = 19次。
内容的提问来源于stack exchange,提问作者Aayu
相关产品推荐
相关产品推荐

