DD 可以用于向管道添加缓冲区吗?

use*_*813 5 linux pipe dd buffer

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

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

有没有办法为此使用“dd”?

fro*_*utz 5

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

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

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

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

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

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

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