C语言中fork()的打印行为疑问:为何输出结果为4?
代码输出4的原因及进程生命周期分析
先看原代码:
#include <stdio.h> #include <unistd.h> int main() { int i, status; int x =1; for ( i = 0; i < 3; i++) { int pid = fork(); x++; if (pid > 0) { wait(&status); x--; exit(-1); } } printf ("x = %d\n", x); return 0; }
执行流程拆解
初始时只有主进程(记为P0),x=1,进入循环:
i=0(P0执行)
- P0调用
fork()生成子进程P1,此时P0和P1的x都是1,随后各自执行x++,x变为2。 - P0中
pid是P1的进程ID(大于0),调用wait(&status)阻塞,等待P1结束。 - P1中
pid=0,继续循环,i变为1。
- P0调用
i=1(P1执行)
- P1调用
fork()生成子进程P2,P1和P2的x都是2,各自执行x++后,x变为3。 - P1中
pid>0,调用wait(&status)阻塞,等待P2结束。 - P2中
pid=0,继续循环,i变为2。
- P1调用
i=2(P2执行)
- P2调用
fork()生成子进程P3,P2和P3的x都是3,各自执行x++后,x变为4。 - P2中
pid>0,调用wait(&status)阻塞,等待P3结束。 - P3中
pid=0,继续循环,i变为3,此时i<3不成立,退出循环。
- P2调用
最终输出
- P3退出循环后,执行
printf("x = %d\n", x),输出x=4,随后return 0正常退出。 - P3结束后,P2的
wait()返回,执行x--(x变为3),调用exit(-1)退出。 - P2结束后,P1的
wait()返回,执行x--(x变为2),调用exit(-1)退出。 - P1结束后,P0的
wait()返回,执行x--(x变为1),调用exit(-1)退出。
- P3退出循环后,执行
进程结束时机总结
- P3:循环结束后执行打印,随后
return 0正常退出。 - P2:等待P3完全结束后,执行
x--,调用exit(-1)退出。 - P1:等待P2完全结束后,执行
x--,调用exit(-1)退出。 - P0:等待P1完全结束后,执行
x--,调用exit(-1)退出。
只有P3会走到printf语句,所以最终输出是4。
内容的提问来源于stack exchange,提问作者Artemis
相关产品推荐
相关产品推荐

