关于fork()函数创建6个子进程及代码中数字1打印次数的疑问
问题解答
一、为什么数字1会被打印7次?
先明确几个关键前提:
fork()调用后,父进程返回子进程PID(非0整数),子进程返回0;|是按位或运算符,非短路逻辑或||,左右两侧的fork()都会执行;printf("i: %d\n",i)中的\n会刷新输出缓冲区,子进程不会继承未刷新的输出,不会重复打印i:0。
i=0循环后的进程数量:
初始进程记为P0:
P0打印i: 0,缓冲区刷新。- 执行第一个
fork():创建子进程P1。P0得到非0返回值,P1得到0。 - 执行第二个
fork()(因|非短路,P0和P1都会执行):P0创建子进程P2,得到非0返回值;P1创建子进程P4,得到非0返回值,P4得到0。
- 条件判断
f1 | f2:P0:非0 | 非0 = 非0 → 执行fork(),创建P3;P1:0 | 非0 = 非0 → 执行fork(),创建P5;P2:继承P0的第一个fork()非0返回值,自身第二个fork()返回0 → 非0 | 0 = 非0 → 执行fork(),创建P6;P4:0 | 0 = 0 → 不执行fork()。
此时系统中存在7个进程:P0、P1、P2、P3、P4、P5、P6。进入i=1循环时,这7个进程都会执行printf("i: %d\n",i),各自打印一次i: 1,总计7次。
二、父进程(初始进程P0)为何创建6个子进程?
初始进程P0在两次循环中各创建3个子进程,累计6个:
i=0循环:- 第一个
fork()创建P1; - 第二个
fork()创建P2; - 条件为真时的
fork()创建P3;
- 第一个
i=1循环:- 第一个
fork()创建P7; - 第二个
fork()创建P8; - 条件为真时的
fork()创建P9;
- 第一个
你之前的误解在于忽略了|的非短路特性,以及初始进程会在两次循环中完整执行fork()逻辑,而非仅在第一次循环创建所有子进程。
内容的提问来源于stack exchange,提问作者Thatoneguy
相关产品推荐
相关产品推荐

