标准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;}
如果直接执行:./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
- 标准IO重定向到文件非交互式设备时的缓冲策略
- java的重定向标准IO
- [技巧]标准IO重定向
- 用dup2将标准输出重定向到一个打开的文件,稍后,恢复标准输出
- Linux重定向:将标准输出stdout和标准错误stderr重定向到一个文件
- (采用标准输入输出)在本机测试时用文件重定向,一旦提交到比赛就可以方面删除重定向语句的范例
- 重定向标准输出到文件有时看不到文件的内容
- 关于dup2重定向STDOUT_FILENO之后的文件缓冲问题
- Linux 文件IO: 缓冲与非缓冲
- dup重定向到标准
- c语言标准输入输出重定向到不同文件
- C 如何将标准输出重定向到文件
- 将Linux 标准输出,错误输出重定向到文件
- C#中将标准输出重定向到日志文件
- python同时标准输出和重定向到文件保存
- 将标准输出重定向到一个文件的同时并在屏幕上显示
- 对一个标准的输入/输出窗口临时重定向到一个文件
- java重定向程序的标准输出System.out到文件
- 核心动画(三)-关键帧动画
- AtCoder Grand Contest 017-B
- JS-5-prototype、__proto__
- 美团CodeM初赛B轮-黑白树(树形结构贪心)
- 并发编程笔记(一)
- 标准IO重定向到文件非交互式设备时的缓冲策略
- POJ 1276 Cash Machine <多重背包>
- HihoCoder
- C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测
- JS-6-this
- 安装activiti
- linux rm 命令(删除文件和目录)
- Java8 新特性
- Insert Sort