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

来源:互联网 发布:淘宝如何推广引流 编辑:程序博客网 时间:2024/05/16 19:02

首先提两个熟悉的概念

全缓冲:在进行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;}




阅读全文
0 0
原创粉丝点击