linux – 可以使用DD为管道添加缓冲区吗?教程
我正在从命名管道中读取和写入音频.我遇到了一个问题,我的读取过程滞后,导致管道的缓冲区填满和丢弃帧.我想在管道中插入一个任意大尺寸的缓冲区.
我正在尝试使用’dd’来做这件事,但’obs’和’ibs’似乎是指读/写块大小,而不是缓冲区大小?
有没有办法为此目的使用’dd’?
解决方法:
它可以这样使用,但它很糟糕.
例如,dd bs = 1M将是1 MiB缓冲区,但它可能无法解决您的音频问题.如果dd得到一个简短的读取,它将直接传递,所以它不会使用缓冲区.您可以添加iflag = fullblock以强制dd完全填充其缓冲区,但是它将读取1 MiB数据,写入1 MiB数据,读取1 MiB数据,… dd将不会接受输出前的新输入步骤完成,所以你的“缓冲区”将是100%满,100%空,100%满……并且无论多长时间缓冲区填满/清空,另一侧都会被卡住.
在考虑管道缓冲区时,这不是您想要/期望的特性.如果你看一下实际的管道缓冲区,比如bfr或pv,它们都会在输出进行时接受新的输入,它们会努力保持良好的填充率,因此任何一方都不必等待超过绝对必要的时间.
使用实际管道缓冲区时,将始终接受输入(缓冲区未满)并始终提供输出(缓冲区不为空),并且它们可能具有高级选项,例如保证预填充,最小填充,. ..
dd没有做任何事情,事实上dd依赖于在外部进行缓冲,当使用块设备时,读/写并发主要由内核提供(readahead / cache / …).
基本上,您只会将dd视为简约环境中的管道缓冲区,而这些环境中没有其他程序适合可用任务.
如果必须使用dd但dd的特性不适合您的任务,则可以菊花链式连接多个dd以获得缓冲区的“更平滑”结果.但即使这样,它也可能不适合某些用例.