#include <stdio.h> int main(int argc, char *argv[]) { printf("hello world"); while(1); }
将上面的函数编译,运行不会在屏幕上打印出hello world。是因为
1.对于库函数,如果标准输出连到终端设备,则它是行缓冲的(遇到回车换行符或者是缓冲区满了才输出);否则是全缓冲的(缓冲区填满或者是程序运行结束了才输出)。
2.程序运行结束时,会刷新所有的缓冲区。
修改程序,在hello world后面加上\n,编译运行后hello world会输出到终端。
#include <stdio.h> int main(int argc, char *argv[]) { printf("hello world\n"); while(1); }修改程序去掉最后的while(1),由于程序正常运行结束了,此时会刷新所有缓冲区,即使我们没有在后面加\n,也会输出到终端。
#include <stdio.h> int main(int argc, char *argv[]) { printf("hello world"); }
修改程序让缓冲区填满,下面的程序一直输出,这样会使缓冲区填满,所以屏幕一样会有打印。
#include <stdio.h> int main(int argc, char *argv[]) { while(1) printf("hello world"); }
从上面的列子我们可以看出,如果标准输出连到终端设备,则它是行缓冲的;
下面验证如果标准输出不是连接到终端的时候,则是全缓冲的。
#include <stdio.h> int main(int argc, char *argv[]) { printf("hello world\n"); while(1); }
以这个程序为例,我们知道这个程序如果连接到的是终端的话,是会输出的,因为终端是行缓冲的,这里也提供了回车换行。
但是如果这样运行这个程序:a.out > out.txt。其中a.out为上面程序编译出来的可执行文件,我们将a.out的输出重定向到out.txt。
运行后我们会发现out.txt文件中不会出现hello world。这是因为如果我们在运行这个程序时将它从定向到一个文件的话,则标准输出变成了全缓冲的,即要等到缓冲充满后,或是程序正常退出后才会刷新缓冲区。
由于上面的缓冲机制,也给我们编写程序时带来了一些奇怪的问题。解决办法有如下两种:
1.任何时候我们都可以使用fflush(stdout)来刷新标准输出缓冲区。
2.使用不带缓冲的系统调用write替代printf输出。
原文地址:http://blog.csdn.net/it_liuwei/article/details/45022671