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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值