linux - 在没有 fflush(stdout) 的情况下将 block 缓冲数据写入文件

标签 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

如果我要将此命令的输出写入文件,我将无法写入它,因为输出可能是 block 缓冲的,并且当我终止命令的输出时只会生成一个空文本文件以上命令(CTRL+C)

这就是我所说的 block 缓冲。

The three types of buffering available are unbuffered, block
buffered, and line buffered. When an output stream is unbuffered, information appears on the destination file or terminal as soon as written; when it is block buffered many characters are saved up and written as a block; when it is line buffered characters are saved up until a newline is output or input is read from any stream attached to a terminal device (typically stdin). The function fflush(3) may be used to force the block out early. (See fclose(3).) Normally all files are block buffered. When the first I/O operation occurs on a file, malloc(3) is called, and a buffer
is obtained. If a stream refers to a terminal (as stdout normally does) it is line buffered. The standard error stream stderr is always unbuffered by default.

现在,执行这个命令,

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

将生成一个空文件,因为当我终止进程时缓冲区 block 可能尚未完成,并且由于我不知道 block 缓冲区大小,因此无法等待 block 完成。

为了将此命令的输出写入文件,我必须在 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

但我的问题是:

有没有什么方法可以声明缓冲区 block 的大小,以便我知道何时生成缓冲区 block ,从而无需使用 fflush()

是否可以将缓冲区类型从 Block buffered 更改为 unbuffered 或 line buffered?

最佳答案

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

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

关于linux - 在没有 fflush(stdout) 的情况下将 block 缓冲数据写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21112300/

相关文章:

bash - 从日志文件中提取关键字

c# - 进程需要按 <enter> 才能继续。可以使用 Mono GTK# 吗?

我可以在用户空间中遍历进程的页表吗?

linux - 在 unix 中将多行、带引号的字符串作为单个命令行参数传递?

bash - 重复安全组的 ba​​sh 脚本中 AWS CLI 的错误处理

linux - 用于计算两个不同子集中的列之间的平均值的 Shell 脚本

具有计算值和数字范围的 awk 过滤列 |更新

linux - iwlib 尝试获取访问点名称 - u.addr.sa_data 包含可疑字符,导致 QString 为空

linux - 订阅/sys 中的文件

macos - 在 bash 命令前设置环境变量