标准IO缓冲

一、问题描述:

int main() { int i = 1; while(1) { printf("%d", i); sleep(1); i++; } }

终端无输出结果。

二、分析问题

1. 标准输出(stdout)是行缓冲模式。其何时会输出在于:printf里有'\n',fflush(stdout)或setbuf(stdout, NULL),缓冲区已满三种。在应用程序退出时(exit()),会ffush缓冲区。

2. 上述程序,如果将sleep(1) ->usleep(1000)会有输出,原因在于printf的缓冲区已满所以才会输出。

三、结论

由于sleep(1)等待时间稍长,printf缓冲区没有填满,所以终端没有输出。

另:可以通过如下程序测试printf的缓冲区大小:

int main() { int i = 1; while(1) { printf("%d", i); usleep(10000); i++; } }

当输出第一组数据时,立刻ctrl+c终止,拷贝数据到buf.txt文件,查看文件可知printf缓冲区大小。

参考资料:

《APUE》5.4节——缓冲

《关于 printf 和 缓冲区》http://hi.baidu.com/glasswm/blog/item/52b5dbc4ff06aec738db49a0.html

《关于流和缓冲区的理解以及一般标准输入问题的解决方法小结》http://bbs.chinaunix.net/viewthread.php?tid=588099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值