DD를 사용하여 파이프에 버퍼를 추가할 수 있나요?

DD를 사용하여 파이프에 버퍼를 추가할 수 있나요?

명명된 파이프에서 오디오를 읽고 쓰고 있습니다. 읽기 프로세스가 지연되어 파이프 버퍼가 가득 차서 프레임이 삭제되는 문제가 발생했습니다. 파이프에 임의로 큰 크기의 버퍼를 삽입하고 싶습니다.

이 작업을 수행하기 위해 "dd"를 사용하려고 하는데 "obs"와 "ibs"가 버퍼 크기가 아닌 읽기/쓰기 블록 크기를 나타내는 것 같습니다.

이를 달성하기 위해 "dd"를 사용하는 방법이 있습니까?

답변1

이렇게 사용할 수 있지만 나쁘게 사용할 수 있습니다.

예를 들어 dd bs=1M1MiB 버퍼이지만 오디오 문제가 해결되지 않을 수 있습니다. 짧은 읽기를 받으면 dd버퍼를 사용하지 않도록 직접 전달됩니다. 버퍼를 완전히 채우도록 iflag=fullblock강제를 추가할 수 있지만 dd그러면 1MiB의 데이터를 읽고, 1MiB의 데이터를 쓰고, 1MiB의 데이터를 읽고... dd출력 단계가 완료될 때까지 새 입력을 받아들이지 않습니다. "버퍼"는 100% 가득 차고, 100% 비어 있고, 100% 가득 찼습니다. 버퍼가 채워지거나 비워지는 데 시간이 얼마나 걸리더라도 반대편은 멈춰 있을 것입니다.

이는 파이프 버퍼를 고려할 때 원하거나 기대하는 기능이 아닙니다. bfr또는 와 같은 실제 파이프 버퍼를 살펴보면 pv둘 다 출력이 진행되는 동안 새로운 입력을 받아들이고 프로세스 전반에 걸쳐 좋은 채우기 속도를 유지하려고 노력하므로 어느 쪽도 절대적으로 필요한 것보다 더 오래 기다릴 필요가 없습니다.

실제 파이프 버퍼를 사용하면 입력이 항상 허용되고(버퍼가 가득 차지 않은 경우) 출력이 항상 제공되며(버퍼가 비어 있지 않은 경우) 보장된 미리 채우기, 최소 채우기 대기와 같은 고급 옵션이 있을 수 있습니다. ..

dd아무것도 하지 않고 실제로 dd외부에서 수행되는 버퍼링에 의존하며, 블록 장치를 사용할 때 읽기/쓰기 동시성은 커널에 의해 주로 제공됩니다(미리 읽기/캐시/...).

기본적으로 dd사용 가능한 작업에 적합한 다른 프로그램이 없는 최소한의 환경에서는 파이프 버퍼로만 간주됩니다.

반드시 사용해야 dd하지만 그 특성이 dd작업에 적합하지 않은 경우 dd"더 부드러운" 결과를 위해 여러 버퍼를 데이지 체인 방식으로 연결할 수 있습니다. 그러나 그럼에도 불구하고 일부 사용 사례에는 적합하지 않을 수 있습니다.

관련 정보