【发布时间】:2014-01-14 11:21:14
【问题描述】:
根据我对缓冲区的理解:缓冲区是临时存储的数据。
例如:假设您想要实现一种算法来确定某事物是语音还是噪声。您将如何使用持续不断的声音数据流来做到这一点?这将是非常困难的。因此,通过将其存储到数组中,您可以对这些数据进行分析。
这个数据数组称为缓冲区。
现在,我有一个输出连续的 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).
这就是我所说的块缓冲。
三种可用的缓冲类型是无缓冲、块
缓冲和行缓冲。当输出流未缓冲时, 信息立即出现在目标文件或终端上 书面;当它被块缓冲时,许多字符被保存并 写成一个块;当它是行缓冲字符时保存 直到输出换行符或从任何流中读取输入 连接到终端设备(通常是标准输入)。功能 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
会生成一个空文件,因为我终止进程时缓冲区块可能尚未完成,并且由于我不知道块缓冲区大小,因此无法等待块完成。
为了将此命令的输出写入文件,我必须在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()?
或
是否可以将缓冲区类型从块缓冲更改为无缓冲或行缓冲?
【问题讨论】:
-
不太明白你的问题,但你可以创建自定义结构和函数,记录你需要的信息,比如当前缓冲区数据大小。
-
你的问题解释了缓冲区的概念.. :)
-
我很确定bash在
GPS_data.txt本身上调用fclose,一旦命令终止,fflush就是缓冲区,除非它以信号终止,例如分段错误或其他。也就是说,如果您只是简单地执行cmd > file并且file没有被写入(而cmd实际产生了输出),那么您的cmd有问题。 -
据我所知,该命令完全没问题...如果有任何错误,现在有人会发现错误,因为这里已经详细讨论过...stackoverflow.com/questions/20788774/…
-
@Shahbaz 请查看添加的详细信息。
标签: linux bash awk buffer block