DD 可以用来给管道添加缓冲区吗?

DD 可以用来给管道添加缓冲区吗?

我正在从命名管道读取和写入音频。我遇到了一个问题,我的读取过程滞后,导致管道的缓冲区填满并丢帧。我想在管道中插入任意大大小的缓冲区。

我正在尝试使用“dd”来执行此操作,但“obs”和“ibs”似乎是指读/写块大小,而不是缓冲区大小?

有没有办法使用“dd”来达到此目的?

答案1

它可以这样使用,但很糟糕。

例如,dd bs=1M将是 1 MiB 缓冲区,但它可能无法解决您的音频问题。如果dd获得简短的读取,它将直接传递,因此它不会使用缓冲区。您可以添加iflag=fullblock强制dd完全填满其缓冲区,但随后它将读取 1 MiB 数据,写入 1 MiB 数据,读取 1 MiB 数据,...dd在输出步骤完成之前不会接受新输入,因此你的“缓冲区”将是100%满、100%空、100%满……无论缓冲区填满/清空需要多长时间,另一边都会被卡住。

在考虑管道缓冲区时,这不是您想要/期望的特性。如果您查看实际的管道缓冲区,例如bfrpv,它们都在输出进行时接受新输入,它们努力在整个过程中保持良好的填充率,因此双方都不必等待超过绝对必要的时间。

使用真实的管道缓冲区,输入将始终被接受(当缓冲区未满时),输出将始终被提供(当缓冲区不为空时),并且它们可能具有高级选项,例如保证预填充、最小填充等。 ..

dd不做任何事情,实际上dd依赖于外部完成的缓冲,当使用块设备时,读/写并发很大程度上由内核提供(预读/缓存/...)。

基本上,您只会dd在没有其他适合可用任务的程序的简约环境中考虑将其视为管道缓冲区。

如果您必须使用dd但其特性dd不适合您的任务,您可以以菊花链方式连接多个dd缓冲区以获得“更平滑”的结果。但即便如此,它也可能不适合某些用例。

相关内容