使用setvbuf更改printf的默认buffer 行为
2016-08-12 23:28
225 查看
有3种buffer行为,“不缓冲”,“基于块的缓冲”和“基于行的缓冲”。stdout(printf)默认是基于行的缓冲,即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候,这些字符才会被打印出来;标准错误输出stderr默认是不缓冲的,即写到stderr的字符会马上被打印出来。
下面的例子每隔1S,用printf输出一个“Hello World!”字符串:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
while (1) {
printf("Hello World!");
sleep(1);
}
return 0;
}
实际运行的结果是很长一段时间内BUFSIZ没有被填满前,没有任何输出。前面提到stdout(printf)是“基于行的缓冲”,我们在“Hello World!”后加一个换行“\n”试试。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
while (1) {
printf("Hello World!\n");
sleep(1);
}
return 0;
}
运行结果是每隔1S有一个“Hello World!”和换行输出,如下:
Hello World!
Hello World!
Hello World!
Hello World!
下面尝试通过int setvbuf(FILE *stream, char *buf, int mode, size_t size); 更改stdout的默认缓冲行为,将line buffered修改为unbuffered。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
while (1) {
printf("Hello World!");
sleep(1);
}
return 0;
}
运行结果是每隔1S有一个“Hello World!”输出,如下:
Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
基于stdout和stderr的缓冲行为,如果我们在调试问题打印输出的时候想马上看到输出结果,可以将stdout的line buffered修改为unbuffered,或者使用fprintf(stderr, ...)。
下面的例子每隔1S,用printf输出一个“Hello World!”字符串:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
while (1) {
printf("Hello World!");
sleep(1);
}
return 0;
}
实际运行的结果是很长一段时间内BUFSIZ没有被填满前,没有任何输出。前面提到stdout(printf)是“基于行的缓冲”,我们在“Hello World!”后加一个换行“\n”试试。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
while (1) {
printf("Hello World!\n");
sleep(1);
}
return 0;
}
运行结果是每隔1S有一个“Hello World!”和换行输出,如下:
Hello World!
Hello World!
Hello World!
Hello World!
下面尝试通过int setvbuf(FILE *stream, char *buf, int mode, size_t size); 更改stdout的默认缓冲行为,将line buffered修改为unbuffered。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
while (1) {
printf("Hello World!");
sleep(1);
}
return 0;
}
运行结果是每隔1S有一个“Hello World!”输出,如下:
Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!
基于stdout和stderr的缓冲行为,如果我们在调试问题打印输出的时候想马上看到输出结果,可以将stdout的line buffered修改为unbuffered,或者使用fprintf(stderr, ...)。
相关文章推荐
- 更改远程桌面使用的默认端口
- C#中使用派生类更改基类的数据和行为
- SSH默认端口更改后使用Git(转)
- 使用百度地图更改默认图标(默认小蓝点)
- angular ngClick阻止冒泡使用默认行为的方法
- 小技巧: 当ACE_Svc_Handler关闭时使用的默认行为
- 在录入文字时使用Ctrl+Z即可撤销Word默认的自动编号行为
- 关于Vim的使用:如何更改默认字体和取消自动备份
- 更改MQX中printf对应的默认串口
- angular2 使用更改默认端口,并配置proxy.config.json进行跨域访问
- win8默认使用IE浏览器打开QQ空间,通过如下设置可以更改浏览器
- LINK - JS: 使用event.preventDefault 阻止表单控件默认提交的行为
- 如何更改puppetmaster证书默认的使用期限
- Git的使用—git push的默认行为
- 使用jQuery实现更改默认alert框体
- 如何更改struts中错误默认返回input InputConfig内methodName跟resultName的使用方法
- 【memcache】windos下 memcache更改默认的端口和最大使用内存
- 在老项目中使用Gradle:更改默认目录结构
- 更改Ubuntu 12.04默认的shell(使用的是 L 类型)
- PhotoPicker的深度使用 自定义PhotoPicker 更改PhotoPicker默认黑色背景