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)使得程序一直执行,当缓冲区未满时,不会输出打印。