您的位置:首页 > 其它

标准IO重定向到文件非交互式设备时的缓冲策略

2017-07-09 23:42 323 查看
首先提两个熟悉的概念

全缓冲:在进行I/O操作时,只有当I/O缓冲区被填满时,才进行真正的I/O操作。所以对于全缓冲的缓冲区可由标准I/O例程自动刷新,即当缓冲区填满时,还有一种方法就是调用函数fflush进行刷新。

行缓冲:在I/O操作时,输入输出遇到换行符时进行,进行真正的I/O操作。对于行缓冲,标准I/O每一行缓冲区的长度是固定的,所以只要填满了缓冲区,即使没有遇到换行符,也换刷新缓冲区。

最近代码遇到一个情况,printf("hello world\n");的时候,一直习惯重定向到文件中,去定位问题,发现死活某些语句没有出来。以为是代码出了什么逻辑问题。后来发现语句没有输出到文件中,但如果不进行重定向时,则直接会输出到终端中。

对于printf的内容不显示,则将IO库的缓冲刷新到操作系统中,以往的经验是这样:

1、对printf语句,加上\n换行符号,能刷新缓冲到标准输出中。这种称为行缓冲。

2、加上fflush函数,手动进行刷新IO标准库的缓冲,则也可以显示到标准输出中。

测试代码如下:

#include <stdio.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
printf("hello world\n");
sleep(3);
return 0;
}


g++ test.cpp -o test

如果直接执行:./test

则可以马上显示出hello world,显示正常。因为输出到标准设备,出现了\n换行符号。

如果进行重定向:./test |tee log.txt

这种情况下则无法正常显示hello world

原因是:当标准IO不涉及到交互式设备时,例如文件,管道时,则是全缓冲策略。即使你加了\n换行符也不会刷新缓冲区。

所以如果想要重定向之后,能正常显示,可以进行fflush操作。

正常显示代码如下:

#include <stdio.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
printf("hello world\n");
fflush(stdout);
sleep(3);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: