一道关于fork的笔试题
来源:互联网 发布:淘宝店铺下载 编辑:程序博客网 时间:2024/04/27 13:55
转载出处:http://blog.chinaunix.net/uid-26946560-id-3399242.html
下面的这段代码所要我们求的是总共打印出多少个“-”。
题目给出了两种打印方法,一种加了“\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个“-”了。
点击(此处)折叠或打开
- include <stdio.h>
- int main(int argc,char*argv[])
- {
- int i;
- for(i =0; i<2 ;i++)
- {
- fork();
- //printf("-");
- printf("-\n");
- }
- return 0;
- }
加了“\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个“-”了。
注释:标准I/O库提供缓冲的目的是尽可能的减少使用read和write调用的次数。
标准I/O缓冲有三种:全缓冲、行缓冲和不带缓冲。行缓冲由换行符进行冲洗。
标准I/O缓冲有三种:全缓冲、行缓冲和不带缓冲。行缓冲由换行符进行冲洗。
0 0
- 一道关于fork的笔试题
- 一道关于fork的笔试题
- 关于fork的笔试题
- 关于linux fork()函数的一道题
- 关于fork的一道题目
- fork()的一道题
- 关于位运算的一道笔试题
- 一道关于字符串逆序的笔试题
- 分享一道关于素数的笔试题
- 一道关于this的笔试题
- 关于密码破解的一道笔试题
- 关于一道阿里巴巴笔试题的思考
- 关于创新工场的一道笔试题
- 一道关于字符查找的笔试题
- 关于mysql语句的一道笔试题
- 一道关于绑鞋带的笔试题
- 一道关于内存分配的笔试题
- 一道关于绑鞋带的笔试题
- 多线程讲解
- APUE 笔记
- [Ruby笔记]26. self 不变,每一次调用函数都会产生新的local scope
- CSS3 perspective 属性
- [Ruby笔记]27. ::String 前加双冒号确保使用built-in Ruby class
- 一道关于fork的笔试题
- [Ruby笔记]28.Ruby @@class_variables 类变量 vs @instance_variable 实例变量
- 趣味程序之数学之美系列
- 在Ubuntu 14.04 64bit上安装网易云音乐Linux版本(最新官方版)
- TBB(Intel Threading Building Blocks)学习笔记
- 检测java对象占用内存的情况工具之内存泄漏
- [Ruby笔记]29. Ruby yield from method to block 从方法到块
- 视图控制器
- html5-video标签屏蔽右键视频另存为的js代码