在*nix系统中,缓冲方式存在三种,分别是:
1,全缓冲
2,行缓冲
3,无缓冲
在学习APUE这本书时,程序8-1中,就很好的体现了全缓冲和行缓冲的区别,代码如下:
编译成功后,我这里生成的二进制文件默认为a.out
运行:./a.out
可以看到结果如下:
运行./a.out > temp.out
结果如下:
分析原因:
在./a.out输出中,标注输出是STDOUT_FILENO,是交互式的终端,所以系统采用的缓冲方式行缓冲,所以在printf函数中,输出后,立即刷新缓冲区,而在./a.out > temp.out命令中,输出流定向到了temp.out文件中,所以采用的输出方式为全缓冲方式,所以会两次输出
a write to stdout
可以将程序中fflush(NULL)加入,则只会输出一次
a write to stdout
因为flush即时刷新了缓冲区。