写入块缓冲数据到文件没有fflush(标准输出)

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

例如:假设您想要实现一个algorithm来确定是语音还是噪声。 你将如何使用声音数据的恒定stream量来做到这一点? 这将是非常困难的。 因此,通过将其存储到数组中,您可以对此数据执行分析。

这组数据被称为缓冲区。

现在,我有一个输出连续的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)

这是我的意思是块缓冲。

可用的三种缓冲types是无缓冲的,块
缓冲和行缓冲。 当输出stream没有缓冲时,一旦写入,信息就会出现在目标文件或terminal上。 当它被块caching时,很多字符被保存起来并写成块; 当它是行缓冲的字符被保存起来,直到输出换行符或从连接到terminal设备(通常为stdin)的任何stream读取input。 函数fflush(3)可以用来强制阻止提前。 (见fclose(3)。)通常所有的文件都是块缓冲的。 当第一个I / O操作发生在一个文件上,malloc(3)被调用时,还有一个缓冲区
被获得。 如果一个stream指向一个terminal(正常情况下是stdout),它是行缓冲的。 标准错误streamstderr默认情况下始终是无缓冲的。

现在执行这个命令,

 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 

将会生成一个空文件,因为当我终止进程时缓冲块可能还没有完成,并且由于我不知道块缓冲区的大小,所以没有办法等待块完成。

为了将这个命令的输出写入一个文件中,我必须在awk使用fflush() ,这会成功地将输出写入到文本文件中,我已经成功完成了。

这里是:

 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()

要么

无论如何改变缓冲区types从块缓冲到无缓冲或行缓冲吗?

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

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