您的位置:首页 > 职场人生

一个关于fork()的面试题

2017-07-17 01:39 232 查看
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,程序结束;每个进程各自的缓存区开始得到刷新;将自己缓存区的内容打印到外设上;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题