将块缓冲数据写入文件而不用fflush(stdout)

时间:2014-01-14 11:21:15

标签: linux bash awk buffer block

根据我对缓冲区的理解:缓冲区是临时存储的数据。

例如:假设您想要实现一种算法来确定某些内容是语音还是噪音。你会如何使用恒定的声音数据流?这将非常困难。因此,通过将其存储到数组中,您可以对此数据执行分析。

这个数据数组称为缓冲区。

现在,我有一个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缓冲更改为无缓冲或行缓冲?

1 个答案:

答案 0 :(得分:3)

您可以使用stdbuf运行修改后的缓冲区大小的命令。

例如,stdbuf -o 100 awk ...将使用100字节标准输出缓冲区运行awk