一个关于fork()的面试题

来源:互联网 发布:怎么下载ppt软件 编辑:程序博客网 时间:2024/05/22 14:53

2.【附加题】–请问下面的程序一共输出多少个“-”?

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

解析:
因为printf输出是带缓存机制的,属于行缓存;当不刷新缓冲区或者没有遇到换行符之前;printf不会刷新自己的缓冲区;
而,我们知道,fork()后,父进程会产生一个子进程;此子进程和父进程共享父进程虚拟地址空间的代码段,然后采用写时拷贝的方式,子进程拥有自己全新的数据段,栈和堆;当然子进程会拷贝父进程的缓存区;
当第一次i=o,进入循环时,假设此时父进程为p1,他会fork()出一个自己的子进程p2;
由于第一次i=0时,刚进来父进程p1的缓存区没有内容;所以其子进程p2的拷贝的父进程p1的缓冲区里面为空;此时父子进程p1和p2共享fork()之后的代码段printf(” _”);
然后各自打印一次该信息到自己的缓冲区,由于没有遇见缓冲区刷新;所以不会讲该
printf的内容打印出来;而是保存到自己各自的缓存区;等到i=1进来之后,p1继续fork()处一个子进程,记为p3,此时p3进程拷贝了父进程p1的缓存区,所以p3进程空间的缓存区一开始里面就有一个内容;这时p3和p1共享下面的代码段;p3打印;将打印内容存放在自己的缓存区,此时p3的缓冲区中有两个内容;而p1此时也打印,将内容放到自己的缓存区中;同理p2做父进程,产生的子进程p4,拷贝了p2的缓存区,里面初始就有一个内容,然后执行输出语句,给自己的缓冲区有加入一个内容;所以p4这时也有2个待打印到外设的内容;而p2作为p4的父进程也执行了共享代码段的语句;也在给自己的缓冲区添加一个内容;
所以讲,p1,p2,p3,p4各自进程地址空间的各自的缓冲区的内容加起来,正好为8个;

等到主函数return,程序结束;每个进程各自的缓存区开始得到刷新;将自己缓存区的内容打印到外设上;

这里写图片描述

原创粉丝点击