微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

写入块缓冲数据到文件没有fflush标准输出

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

例如:假设您想要实现一个algorithm来确定是语音还是噪声。 你将如何使用声音数据的恒定stream量来做到这一点? 这将是非常困难的。 因此,通过将其存储到数组中,您可以对此数据执行分析。

这组数据被称为缓冲区。

现在,我有一个输出连续的Linux命令:

阻止到给定主机或IP的传出TCP连接?

如何在Linux内核中使用bio请求来读取扇区

在Linux的铿锵块?

Linux:写入被分成512K块

更改Windows中的块日记(NTFS)

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",3,5,2)}' < /dev/ttyUSB0

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

这是我的意思是块缓冲。

可用的三种缓冲types是无缓冲的,块

缓冲和行缓冲。 当输出stream没有缓冲时,一旦写入,信息就会出现在目标文件或terminal上。 当它被块caching时,很多字符被保存起来并写成块; 当它是行缓冲的字符被保存起来,直到输出换行符或从连接到terminal设备(通常为stdin)的任何stream读取input。 函数fflush(3)可以用来强制阻止提前。 (见fclose(3)。)通常所有的文件都是块缓冲的。 当第一个I / O操作发生在一个文件上,malloc(3)被调用时,还有一个缓冲区

被获得。 如果一个stream指向一个terminal(正常情况下是stdout),它是行缓冲的。 标准错误streamstderr认情况下始终是无缓冲的。

现在执行这个命令,

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F",2)}' < /dev/ttyUSB0 > outputfile.txt

将会生成一个文件,因为当我终止进程时缓冲块可能还没有完成,并且由于我不知道块缓冲区的大小,所以没有办法等待块完成。

为了将这个命令的输出写入一个文件中,我必须在awk使用fflush() ,这会成功地将输出写入到文本文件中,我已经成功完成了。

这里是:

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/GGA/ {print "Latitude:",$3,"Longitude:","Altitude:","Time:",substr($2+50000,2); fflush(stdout) }' < /dev/ttyUSB0 | head -n 2 > GPS_data.txt

但我的问题是:

有什么办法可以声明缓冲区的大小,这样我就可以知道什么时候在生成缓冲区了,这样就省去了用fflush() ?

要么

无论如何改变缓冲区types从块缓冲到无缓冲或行缓冲吗?

根据音量/容量阻止USB

Linux内核中的页面交换

cpu如何从磁盘读取?

生产者消费者在块设备驱动程序中的实现?

如何在linux中连续磁盘块中存储文件

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐