하나의 장치에서 여러 장치를 만드시겠습니까?

하나의 장치에서 여러 장치를 만드시겠습니까?

특히 USB 장치를 예로 들면, 이 장치는 일반적으로 하나의 프로세스만 읽기용으로 열고 복제/복사/복사하여 여러 프로세스에서 열고 입력을 읽을 수 있도록 허용합니다. 다음과 같이 :

# Duplicate two streams from microphone
arecord -D [mic] | tee /dev/[#1] > /dev/[#2] &

# Set up process 1
apply-live-effects -filter lo-pass < /dev/[#1] > output1.raw &

# Set up process 2
apply-live-effects -filter hi-pass < /dev/[#2] > output2.raw &

with /dev/[#1]/dev/[#2]are는 독서를 여는 장치입니다. 장비 를 사용할 수 있겠다는 생각이 들었습니다 /dev/loop#. 나는 이것을 가지고 놀아 보았지만 운이 없었습니다.

답변1

장치 복제에 대한 일반적인 개념은 없습니다. 입력 장치로만 제한하더라도 여전히 다른 시간에 다른 값을 반환합니다. 두 프로그램이 서로 다른 시간(단 몇 마이크로초라도)에 동일한 장치에 액세스하는 경우 완전히 다른 데이터를 얻을 수 있습니다.

루프 장치는 블록 장치에 대한 액세스를 허용합니다. 블록 장치는 다르게 동작합니다. 동일한 위치에서 중간에 쓰지 않고 두 번 읽으면 동일한 데이터를 얻게 됩니다. 이는 다른 유형의 장치에는 적용되지 않으므로 문자 장치에는 루프 장치 개념이 없습니다.

스트림을 반환하는 특정 유형의 장치를 고려하고 있습니다. 프로그램이 읽는 데이터는 읽기 시작 및 중지 시점에만 의존한다고 가정합니다. 커널은 도움이 되지 않습니다. 이 특별한 경우에 대한 특별한 지원이 없습니다.

당신이 할 수 있는 일은 장치에서 한 번 읽고 데이터를 사용자 공간에 복사하는 것입니다. 왜 장치에 데이터를 다시 공급하려고 합니까? 이미 받으셨으니 읽어보세요. 출력을 tee여러 프로그램으로 파이프해야 하므로 다음 중 하나를 사용하십시오.명명된 파이프또는프로세스 교체.

mkfifo low high
apply-live-effects -filter lo-pass <low >output1.raw
apply-live-effects -filter ho-pass <high >output2.raw
arecord -D [mic] | tee low >high

또는

arecord -D [mic] | tee >(apply-live-effects -filter lo-pass >output1.raw) >(apply-live-effects -filter hi-pass >output2.raw)

필터가 너무 느리면 tee출력을 필요한 만큼 빨리 읽지 못할 수 있으며, 이로 인해 장치에서 데이터가 필요한 만큼 빨리 읽히지 않아 프레임이 삭제될 수 있습니다. 이건 해결될 수 있어arecordarecord다중 채널, 차단하지 않도록 최선을 다할 것입니다.

arecord -D [mic] | multitee 0-3,4 3> >(apply-live-effects -filter lo-pass >output1.raw) 4> >(apply-live-effects -filter hi-pass >output2.raw)

관련 정보