linux下fork的一道经典面试题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014303647/article/details/81982061

题目: 请问下面的程序一共输出多少个”-”?

int main(void)
{
  int i;
  for(i=0;i<2;i++){
    fork();
    printf("-");
  }
  return 0;
} 

输出为:这里写图片描述

这里看另外一个程序

int main(void)
{
  int i;
  for(i=0;i<2;i++){
    fork();
    printf("-\n");
  }
  return 0;
} 

两个的输出是不一样的
这里写图片描述

为什么加个回车就会有不同呢??

解析:
printf是一个行缓冲函数,先写到缓冲区,满足条件后才将缓冲区刷新到对应文件中刷新缓冲区的条件如下
1)缓冲区填满;
2)写入的字符中有‘\n’、’\r’;
3)调用fflush手动刷新缓冲区;
4)调用scanf要从缓冲区读取数据时,也会将缓冲区内的数据刷新。

所以第一个程序中没有\n的时候,fork的时候,子进程会继承父进程的缓冲区里的 -,故画图为(此图借鉴这里写链接内容回答)
这里写图片描述

所以输出8个“-”

而为什么底下输出6个“-”呢?
这是因为遇到“\n”那么就会把缓冲里的输出到屏幕,所以i=0的时候,父进程parent和子进程child1都输出了“-”,然后他们的 缓冲区为空,所以i=1的时候,parent,child2,child1,child1_2均输出一个“-”,所以共6个“-”

猜你喜欢

转载自blog.csdn.net/u014303647/article/details/81982061