Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167026
  • 博文数量: 20
  • 博客积分: 317
  • 博客等级: 二等列兵
  • 技术积分: 809
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-05 18:37
文章分类

全部博文(20)

文章存档

2014年(1)

2013年(5)

2012年(14)

我的朋友

分类: C/C++

2012-11-06 18:43:36

下面的这段代码所要我们求的是总共打印出多少个“-”。

点击(此处)折叠或打开

  1. include <stdio.h>
  2. int main(int argc,char*argv[])
  3. {
  4.     int i;
  5.     for(i =0; i<2 ;i++)
  6.     {
  7.         fork();
  8.         //printf("-");
  9.         printf("-\n");
  10.     }
  11.     return 0;
  12. }
题目给出了两种打印方法,一种加了“\n”,另一种未加,也就是代码段的8、9两行的打印语句。
加了“\n”的很好理解总共打印出6个“-”,下面的图解释了原理:


在执行了fork()之后,产生了一个子进程,之后执行printf("-\n")语句,所以将会打印6个“-”。

但是在我们将代码中的第9行注释掉,使用第8行的代码,那么又会打印几次呢?这两个语句就差了一个“\n”,恰恰就是这个“\n”使执行结果发生了变化。因为在执行打印语句printf()时,它并不是立即将内容打印出来,而是放到了一个缓冲区中,在缓冲区满之后才会将缓冲区中的内容打印出来。而我们在所打印的内容之后加上“\n”之后就意味着告诉printf()函数马上将缓冲区中的内容打印出来。
所以在没加上“\n”的时候,每次执行printf的时候就会向缓冲区中加入一个“-”,每个进程都有一个属于自己的缓冲区,在fork()的时候,子进程将会拷贝父进程的缓冲区。所以执行过程如下图所示:


进程B拷贝了进程A的缓冲区,所以B刚创建时缓冲区中就有一个“-”了,加上自己加入进去的一个就变成了2个了,而同时A中的缓冲区由于本来就有一个,然后加上一个也变成了2个,同理,C和D的缓冲区中也各自拥有2个“-”,所以总共就有8个“-”了。

阅读(1698) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~