思考一个问题
int main()
{
int i=0;
for(i=0;i<2;i++)
{
fork();
printf("-");
}
return 0;
}
上述代码会输出几次 “-” ?
结果如下
我们可以看到有8个 - 符号被输出了。
这里涉及到printf的知识:stdout的缓冲机制
printf输出条件: (1) 调用fflush; (2) 缓冲区满了; (3) 遇到\n \r这些字符 (4) 遇到scanf这些要取缓冲区的; (5) 线程或者进程退出
所以八个-是由于printf的输出缓存造成的,Stdout中-没有等待到\n的刷新,父进程在子进程创建之前还未结束就被一起复制到了子进程,等待子进程 结束后在子进程的-之前一起打印了出来
证实一下我们的猜测
1 #include <myhead.h>
2 int main(int argc,char *argv[])
3 {
4 int i =0;
5 int count =0;
6 for(i =0;i<2;i++)
7 {
8 int ret =fork();
9 if(ret >0)
10 {
11 printf("father%d",i);
12 }else if(ret ==0)
13 {
14
15 printf("child%d",i);
16 }
17 }
18 return 0;
19 }
20
正如图所示,程序递归的运行先运行的是father这棵树,father0被缓冲在stdout中和child1一起输出,同理child0被缓冲,和它的child1一起输出
这次我们进行最后的证实,利用fflush手动刷新
1 #include <myhead.h>
2 int main()
3 {
4 int i=0;
5 for(i=0;i<2;i++)
6 {
7 int ret =fork();
8 if(ret ==0)
9 {
10
✹ 11 printf("child%d-",i);
12 fflush(stdout);
13 }else if(ret >0)
14 {
15
✹ 16 printf("father%d-",i);
17 fflush(stdout);
18 }
19
20 }
21 return 0;
22
23 }
~
结果如下