unix环境高级编程——库函数的缓冲区

来源:互联网 发布:千里眼淘宝插件手机版 编辑:程序博客网 时间:2024/04/30 09:28
#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输出。


1 0
原创粉丝点击