gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:09:21 25 4
gpt4 key购买 nike

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

例如:假设您想要实现一种算法来确定某物是语音还是噪音。您将如何使用恒定的声音数据流来做到这一点?这将是非常困难的。因此,通过将其存储到数组中,您可以对该数据进行分析。

这个数据数组称为缓冲区。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com