在某网站线上答题中遇到一题目描述如下:
- 以下程序输出的‘-’的个数为()
- A.6 B.8 CD略
- #include <stdio.h>
- #include <stdlib.h>
- int main(void)
- {
- int i;
- for(i = 0;i<2; i++)
- {
- fork();
- printf("-");
- }
- return 0;
- }
简单算了下是6个,结果发现答案是8。非常纳闷,就和实验室的讨论了下,并写了几个测试。
测试用例一
- #include <stdio.h>
- #include <stdlib.h>
- int main(void)
- {
- int i;
- for(i = 0;i<2; i++)
- {
- fork();
- printf("-\n");
- }
- return 0;
- }
该程序输出了6个‘-’,并分为六行
测试用例二
- #include <stdio.h>
- #include <stdlib.h>
- int main(void)
- {
- printf("-");
- sleep(1);
- return 0;
- }
该程序在阻塞1秒后,输出‘-’
由此,得到结论:
1.printf()函数并非是将数据直接直接发送到屏幕上,而是将其暂存到缓存区。
2.缓存区的内容不会立即发送到屏幕上,而是等待当出现‘\n’,EOF,缓存区满,或是进程结束时,再将缓存区中所有的内容发送到屏幕上。
所以我们在回到刚才的题上,其实这个问题的重点在printf()函数上,而不是fork()!
第一次循环,fork()生成两个进程,并在每个进程的缓冲区内写入一个‘-’。注意,此时的printf();之后,内容是不输出到屏幕上的。
第二次循环,fork()再次生成两个新进程,并在每个进程的缓冲区再写入一个‘-’。此时共有四个进程,每个进程的缓冲区内存放两个‘-’。
结束循环,进程读取到return,将缓冲区内的信息输出到屏幕,并清空缓冲区。
这就解释了为什么会出现8个‘-’的现象。