从我了解的缓冲区:缓冲区是临时存储的数据。写块缓冲数据到文件没有fflush(标准输出)
例如:让我们假设你想实现一个算法来确定是否东西是语音或只是噪音。你将如何使用恒定的音频数据流来做到这一点?这将是非常困难的。因此,通过将其存储到数组中,您可以对此数据执行分析。
该数组数据的被称为缓冲区。
现在,我有一个Linux命令,其中输出是连续的:
stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)}' < /dev/ttyUSB0
如果我是这个命令的输出写入到一个文件,我就不能写它,因为输出可能是块缓冲的,并且当我终止上述命令的输出时,将仅生成空文本文件(CTRL + C)。
这里是我的座缓冲的意思。
三种类型的缓冲区域提供缓冲,阻止
缓冲,行缓冲。当输出流没有缓冲时, 信息出现在目标文件或终端上,只要 写入;当它被块缓存时,很多字符都被保存起来,并且被写为块;当它是线路缓冲字符被保存到 直到输出换行符或从连接到终端设备(通常为stdin)的任何流 读取输入为止。 fflush(3)函数可用于强制早期阻止。 (见 fclose(3)。)通常所有文件都是块缓冲。当第一 I/O操作上的文件时,的malloc(3)被调用,并得到缓冲
。如果一个流引用了一个终端(正如标准输出通常是 一样),它是行缓冲的。标准错误流stderr默认为始终未缓冲的 。现在
,执行该命令,
stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)}' </dev/ttyUSB0> outputfile.txt
一个空文件将会产生,因为缓冲块可能尚未当我终止该进程完成,因为我不知道该块缓冲区大小,没有办法等待块完成。
为了将此命令的输出写入文件,我必须使用fflush()
,它们将在awk
之内成功将输出写入到文本文件中,这已成功完成。
这里有云:
stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/GGA/ {print "Latitude:",$3,$4,"Longitude:",$5,$6,"Altitude:",$10,$11,"Time:",substr($2+50000,1,2),".",substr($2,3,2),".",substr($2,5,2); fflush(stdout) }' < /dev/ttyUSB0 | head -n 2 > GPS_data.txt
但我的问题是:
有什么办法来声明缓冲区块大小,这样我就产生在缓冲块的时候知道,所以消除需要使用fflush()
?
OR
反正是有改变缓冲类型从块缓冲,缓冲或行缓冲?
不太理解你的问题,但是你可以创建自定义的结构和函数,记录你需要的信息,比如当前的缓冲区数据大小。 – moeCake
你的问题解释缓冲区概念.. :) –
我非常确定bash在'GPS_data.txt'本身调用'fclose'它自己'fflush'缓冲区一旦命令终止,除非它终止与信号,如分段错误或其他。也就是说,如果你简单地执行'cmd> file'并且'file'没有被写入(而'cmd'实际上产生了输出),那么你的'cmd'有问题。 – Shahbaz