标准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;
}
全缓冲:在进行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;
}
相关文章推荐
- linux文件设备与I/O:C标准I/O函数与无缓冲I/O
- 案例 1-6: 重定向标准输出设备
- 用dup2将标准输出重定向到一个打开的文件,稍后,恢复标准输出
- 重定向已经运行进程的标准输出到文件的办法(通过ptrace注入代码到其他进程并运行)
- 在C和C++中把标准输出重定向到指定文件
- C++之标准设备IO操作流
- 将标准输出重定向到一个文件的同时并在屏幕上显示
- 在python中如何重定向标准输出stdout到文件代码示例
- 标准IO缓冲
- 标准IO缓冲
- 【Java IO】带缓冲的任意文件的复制
- 标准IO文件操作
- IO标准库类型和头文件
- 【Unix】文件IO与标准IO
- 标准IO缓冲详解 全缓冲 行缓冲 不缓冲
- 如何将bash同时重定向到标准输出和其他文件
- 文件IO和标准IO的比较
- 标准IO和重定向
- ZZ: 使用 "接口" 了解设计模式--策略模式(多态)集合框架 泛型、文件、文件流 IO(流)
- Unix中的不带缓冲的文件IO