使用setvbuf更改printf的默认buffer 行为
来源:互联网 发布:普通disco视频软件 编辑:程序博客网 时间:2024/06/05 04:51
有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, ...)。
0 0
- 使用setvbuf更改printf的默认buffer 行为
- setvbuf的使用
- 更改MQX中printf对应的默认串口
- fopen的默认缓冲大小和setvbuf 用法
- setvbuf()和fopen()默认缓冲大小的区别
- fopen的默认缓冲大小和setvbuf 用法
- 更改“流”的行为
- js的默认行为
- setvbuf
- setvbuf
- setvbuf
- setvbuf()
- setvbuf
- setvbuf
- setvbuf()
- setvbuf()
- 小技巧: 当ACE_Svc_Handler关闭时使用的默认行为
- 阻止事件的默认行为
- Leetcode Invert Binary Tree
- Python基础运算符、字符串
- markdown编辑器
- TextView加载HTML数据(网络图片以及图片点击事件的实现)
- Python 局部变量与全局变量
- 使用setvbuf更改printf的默认buffer 行为
- rpm安装mysql5.6
- Android中startActivityForResult竟然不起作用了....
- windows下动态库遇见的问题总结
- 在Ubuntu 12.04上安装LTIB及编译Linux BSP
- HDU - 5256 序列变换 【LIS变形】
- S重构重命名的快捷键
- http://www.cnblogs.com/chenlulouis/archive/2010/07/07/1772631.html
- jdbc oracle数据库访问