【问题标题】:Writing Block buffered data to a File without fflush(stdout)在没有 fflush(stdout) 的情况下将块缓冲数据写入文件
【发布时间】: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 &gt; file 并且file 没有被写入(而cmd 实际产生了输出),那么您的cmd 有问题。
  • 据我所知,该命令完全没问题...如果有任何错误,现在有人会发现错误,因为这里已经详细讨论过...stackoverflow.com/questions/20788774/…
  • @Shahbaz 请查看添加的详细信息。

标签: linux bash awk buffer block


【解决方案1】:

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

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

【讨论】:

  • @Xufyan 添加了一个例子。
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多