咨询C语言3次循环fork程序的总进程数及Hello打印次数
C语言fork程序进程数与printf次数计算
核心结论
- 包含初始父进程在内,总进程数为8个
- printf语句共打印14次“Hello”
原有计算的偏差纠正
- 你误以为程序有4次fork调用,实际整个程序总共执行7次fork操作,并非4次
- 直接套用2^n公式计算的是总进程数,但不能直接用该公式推导printf次数,因为子进程是在循环的不同阶段被创建的,不会从头执行完整的3次循环
逐阶段推演过程
程序的循环共执行3次,每个阶段的进程与打印情况如下:
- i=0 第一次循环
- 初始父进程执行
fork(),新增1个子进程,总进程数为2 - 父、子进程都会执行本次循环的printf,累计打印2次
- 两个进程的i自增为1,进入下一轮循环
- 初始父进程执行
- i=1 第二次循环
- 现存的2个进程各执行1次
fork(),新增2个进程,总进程数达到4 - 4个进程都会执行本次循环的printf,累计打印次数为2+4=6次
- 四个进程的i自增为2,进入下一轮循环
- 现存的2个进程各执行1次
- i=2 第三次循环
- 现存的4个进程各执行1次
fork(),新增4个进程,总进程数达到8 - 8个进程都会执行本次循环的printf,累计打印次数为6+8=14次
- 所有进程的i自增为3,退出循环执行return
- 现存的4个进程各执行1次
关键逻辑说明
fork()创建的子进程会完整复制父进程的运行上下文(包括变量值、程序执行位置),从fork()的返回点继续运行,不会从头执行main函数- 本程序中
if(fork());的if分支为空语句,因此不管fork返回0(子进程)还是正整数(父进程),都会执行后续的printf语句
内容的提问来源于stack exchange,提问作者learning
相关产品推荐
相关产品推荐

