著论准过秦,作赋拟子虚。这篇文章主要讲述printf缓冲区刷新问题相关的知识,希望能为你提供帮助。
以下内容在Linux测试,Window因为没遵循POSIX,所以现象会有不同。
一、前言首先,printf缓冲区的问题,平时不大会发现,当时是在使用sleep函数时出现的。先来看一下问题。
#include < stdio.h>
int main()
{
printf("hello\\n");
sleep(1); //延迟1秒
printf("world\\n");
return 0;
}
上面的代码正常输出:
hello
world
两个之间间隔一秒输出
接下来做一下修改:
#include < stdio.h>
int main()
{
printf("hello"); /*去掉转义字符\\n*/
sleep(1);
printf("world\\n");
return 0;
}
上面的代码输出为:
helloworld
但是输出却是延迟一秒之后才将helloworld一起输出
当我们去掉转义字符‘\\n’,延迟函数sleep不再在语句间延迟,而是变成延迟整个程序。
二、深入理解printfprintf是一个行缓冲函数,先写到缓冲区,满足一定的条件后,才会将缓冲区内容输出到对应文件中,如下几个条件可以刷新缓冲区:
1 缓冲区填满。
2 写入的字符中有‘\\n’ , ‘\\r’。
3 调用fflush手动刷新缓冲区。
【printf缓冲区刷新问题】 4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。
5 调用printf函数的进程或线程结束会调用fflush函数
接下来我们修改一下程序
include < stdio.h>
int main()
{
printf("hello");
fflush(stdout); //强制刷新缓存,输出显示
sleep(1);
printf("world\\n");
return 0;
}
这个时候的效果就是先输出hello,然后1秒之后再输出world。
推荐阅读
- Linux驱动分析之SPI驱动架构
- HA-Spark集群环境搭建(Yarn模式)
- Spark-Local模式环境搭建
- go中使用type关键字来定义类型别名
- 覆盖WordPress核心函数require_wp_db()
- 通过插件覆盖WordPress主题页面
- 覆盖子主题中的模块
- .onscroll函数在单个帖子页面上不起作用
- 一键更改WordPress主题定制器中的所有设置()