码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-13 12:55:19      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:linux   printf   unix   缓冲区   

#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输出。


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

标签:linux   printf   unix   缓冲区   

原文地址:http://blog.csdn.net/it_liuwei/article/details/45022671

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!