SylixOS --- switch语句中缓存刷新问题

1.适用范围

在使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在 print();后加上fflush(stdout); 强制马上输出,避免错误。

2.原理概述

问题描述
当一个任务往消息队列中发送一帧数据后,在另一个线程中读取数据并进入Switch进行判断,发现第一帧数据没有获取到,只有第二针数据发过来后,第一帧数据才能打印信息。

解决描述
经排查发现并不是消息队列存在问题,而是再Switch判断语句中printf函数中提前写了\n换行符导致提前刷新了缓冲区,印后后面的信息就没有打印。
将打印的换行符\n写到语句最后面或者在printf函数下面添加函数fflush刷新函数即可。
printf读进字符串的时候,并不会马上打印,而是先储存在buff里面,当遇到下面4种条件的时候才进行打印:
1、程序结束 return 0;exit(0);
2、遇到"\n"
3、主动刷新 fflush(stdout);
4、缓冲区满。

3.解决方法

3.1换行符\n

如果需要输出前打印\n,可以在输出信息后面再加一个\n来刷新当前的缓存进行数据输出。如果不需要提前打印换行符,则只需要再输出信息后打印一个换行符\n即可。
在这里插入图片描述

3.2fflush刷新缓存

第二种方式则是采用fflush刷新当前的缓存来将未打印的信息刷新出来:

在这里插入图片描述

函数定义

int	 fflush __P((FILE *));

函数说明
fflush()会强迫将缓冲区内的数据写回参数指定的文件中.,如果参数为NULL,fflush()会将所有打开的文件数据更新。

其他用法
fflush()也可用于标准输入(stdin)和标准输出(stdout),用来清空标准输入输出缓冲区。
stdin是standard input的缩写,即标准输入,一般是指键盘;标准输入缓冲区即是用来暂存从键盘输入的内容的缓冲区。
stdout是standard output 的缩写,即标准输出,一般是指显示器;标准输出缓冲区即是用来暂存将要显示的内容的缓冲区。

函数功能
清空标准输出缓冲区,刷新输出缓冲区,即将缓冲区的东西输出到屏幕上
如果圆括号里是已写打开的文件的指针,则将输出缓冲区的内容写入该指针指向的文件,否则清除输出缓冲区。
这里的stdout是系统定义的标准输出文件指针,默认情况下指屏幕,那就是把缓冲区的内容写到屏幕上。

猜你喜欢

转载自blog.csdn.net/qq_40390825/article/details/117993548
今日推荐