2014-01-14 58 views
3

从我了解的缓冲区:缓冲区是临时存储的数据。写块缓冲数据到文件没有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

反正是有改变缓冲类型从块缓冲,缓冲或行缓冲?

+0

不太理解你的问题,但是你可以创建自定义的结构和函数,记录你需要的信息,比如当前的缓冲区数据大小。 – moeCake

+1

你的问题解释缓冲区概念.. :) –

+0

我非常确定bash在'GPS_data.txt'本身调用'fclose'它自己'fflush'缓冲区一旦命令终止,除非它终止与信号,如分段错误或其他。也就是说,如果你简单地执行'cmd> file'并且'file'没有被写入(而'cmd'实际上产生了输出),那么你的'cmd'有问题。 – Shahbaz

回答

3

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

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

+2

'stdbuf -o1000 -awk ...'应该做的伎俩。 – Alfe

+1

@Xufyan添加了一个示例。 –

相关问题