根据我对缓冲区的理解:缓冲区是临时存储的数据。
例如:假设您想要实现一种算法来确定某些内容是语音还是噪音。你会如何使用恒定的声音数据流?这将非常困难。因此,通过将其存储到数组中,您可以对此数据执行分析。
这个数据数组称为缓冲区。
现在,我有一个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)。
这就是Block Buffered的意思。
可用的三种缓冲类型是无缓冲的,块
缓冲和行缓冲。当输出流未缓冲时, 信息一旦出现在目标文件或终端上 书面;当它被块缓冲时,许多字符被保存起来 写成一个块;当它是行缓冲字符时保存 直到输出换行或从任何流读取输入 连接到终端设备(通常是stdin)。功能 fflush(3)可用于尽早强制阻止。 (看到 fclose(3)。)通常所有文件都是块缓冲的。当第一个 I / O操作发生在文件上,调用malloc(3)和缓冲区
得到了。如果流引用终端(正常为stdout) 它是行缓冲的。标准错误流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
,这将成功将输出写入文本文件,我已成功完成。< / p>
这就是:
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()
?
或
无论如何将缓冲区类型从Block缓冲更改为无缓冲或行缓冲?