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) 刷新缓冲区)

Linux C语言printf()函数不加换行符就不能输出打印的内容(fflush(stdout) 刷新缓冲区)

关于printf()函数的缓冲区问题

printf的几点新发现

刷新缓存区方式和刷新内存到磁盘方式总结。

刷新片段不再起作用?