printf缓冲区刷新问题
Posted 嵌入式软件开发交流
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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不再在语句间延迟,而是变成延迟整个程序。
二、深入理解printf
printf是一个行缓冲函数,先写到缓冲区,满足一定的条件后,才会将缓冲区内容输出到对应文件中,如下几个条件可以刷新缓冲区:
1 缓冲区填满。
2 写入的字符中有‘\\n’ , ‘\\r’。
3 调用fflush手动刷新缓冲区。
4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。
5 调用printf函数的进程或线程结束会调用fflush函数
接下来我们修改一下程序
include <stdio.h>
int main()
{
printf("hello");
fflush(stdout); //强制刷新缓存,输出显示
sleep(1);
printf("world\\n");
return 0;
}
这个时候的效果就是先输出hello,然后1秒之后再输出world。
以上是关于printf缓冲区刷新问题的主要内容,如果未能解决你的问题,请参考以下文章
Linux C语言printf()函数不加换行符就不能输出打印的内容(fflush(stdout) 刷新缓冲区)