windows和Linux下的printf的缓冲区对比
#include<stdio.h> int main() { printf("test"); while(1) { } return 0; }
一、Windows
测试环境:
Windows10
编译器:
DevC++5.9.2
gcc4.8.1
测试现象
二、Linux下
测试环境:
centos
编译器:
gcc version 4.8.5
三、缓冲区现象解释
我们知道:
printf是一个“行缓存函数”
先将内容写到缓冲区,满足下面任意条件之一,才会将内容写入到对应的文件或流中。
缓冲区输出到屏幕的条件是
1、有输入,比如printf之后马上用scanf,这种调用scanf等要从缓冲区中读取数据时,也会将缓冲区的数据刷新。
2、遇到'\n'
,'\r'
等,比如printf("test\n")
3、缓冲区填满
4、整个程序正常结束
5、调用fflush或stdout手动刷新缓存区。
显然,Linux下的测试,很符合这个现象。
Q:那么Windows下为什么能正常输出呢?
A:目前你看到的这种现象是MS实现的问题。MS的运行库不支持“行缓冲(最本质的原因,printf调用的是操作系统的底层“系统调用”)”.
而且当stdout是个字符设备的时候,printf会立即输出,所以你的代码中的printf会立即输出。
而我们的Linux环境下,printf的缓冲区大小是多少字节,自行看stdio.h
中的宏BUFSIZ
,但是肯定不会像我们上面的5个字节那么少,所以,上面while(1)使得程序一直执行,当缓冲区未满时,不会输出打印。