本人在初学 Linux 的过程中,对 Linux 的缓冲区犯了难
● 因为尽管不同的编译器都是基于 C 标准进行实现,但它们实现的方式是不一样的
因为对于现在的我而言,想要彻底了解缓冲区的底层逻辑有点不太可能,所以以下的见解都是实践得出的结果,难免有失偏颇,如果有不对的地方,请指正
★★★本篇笔记对于windows缓冲区无能为力,根本没法用实例解释(因为我用visual studio去测试,结果就是它甚至体现不出来缓冲区,只要我有printf语句它就一定会有相应的输出……而用scanf的话虽然能体现出缓冲区的存在,但又测不出来啥)
关于缓冲区刷新(清空)
何为刷新缓冲区:就是把缓冲区里当前有的数据全都拿出来
程序结束后是否刷新缓冲区
经测试,Linux 不会,Windows不知道:
Linux 下的一行代码用 gcc 编译后运行:
输出结果:
如果用 Windows下的 Visual Studio 运行:
其他刷新方式
Linux :
- 读取到 \n 时会刷新缓冲区
- 使用诸如 fflush 的函数进行刷新
- 缓冲区满了
Windows:
- 不是通过读到 \n 进行刷新(可以试试以下的代码)
int main() {
printf("a\n");
Sleep(1000);
printf("已停滞1s\n");
printf("b");
Sleep(1000);
printf("已停滞1s\n");
return 0;
}
- 使用诸如 fflush 的函数进行刷新
- 缓冲区满了
缓冲区与输出端的关系
Linux 下有这样一个代码:
#include<stdio.h>
#include<unistd.h>
int main() {
printf("a\n");
sleep(1);
printf("b");
sleep(1);
printf("cdefgh\r");
sleep(1);
fflush(stdout);
sleep(1);
return 0;
}
运行过程:
- a进入缓冲区,\n 进入缓冲区,缓冲区清空:
- 等待一秒,b进入缓冲区,再等待一秒,cdefgh\r 进入缓冲区,再等待一秒,fflush 清空缓冲区:(输出cdefgh,\r 令光标移至本行开头)
- 等待一秒,程序结束,系统打印的 [hazb@VM-16-8centos code]$ 从光标处打印把 bcdefgh 覆盖,结果呈现出来的就是:
也就是说如果你把 cdefgh 稍微写长点:cdefghijklmnopqrstuvwxyzaaaaaaaaaaaaa
那么后两步就是这样的:
如果是在Windows的VS里
相应的代码:
#include<stdio.h>
#include<windows.h>
int main() {
printf("a\n");
Sleep(1000);
printf("b");
Sleep(1000);
printf("cdefghijklmnopqrstuvwxyzaaaaaaaaaaaaa\r");
Sleep(1000);
fflush(stdout);
Sleep(1000);
return 0;
}
这个……分析不明白