1つのデバイスで複数のデバイスを作成しますか?

1つのデバイスで複数のデバイスを作成しますか?

特にUSBデバイスの例では、通常、1つのプロセスのみを読み取り用に開き、複製/コピー/コピーして複数のプロセスで開いて入力を読み取ることができます。次のように:

# 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

デバイスの複製に関する一般的な概念はありません。入力デバイスのみに制限しても、別の時刻に別の値を返します。両方のプログラムが異なる時間(わずか数マイクロ秒)で同じデバイスにアクセスしている場合は、まったく異なるデータを取得できます。

ループ装置はブロック装置へのアクセスを可能にする。ブロックデバイスは異なる動作をします。同じ場所で途中で書かずに2回読み取ると、同じデータが得られます。これは他のタイプのデバイスには適用されないため、文字デバイスにはループデバイスの概念はありません。

ストリームを返す特定の種類のデバイスを検討しています。プログラムが読み取るデータは、読み出しの開始と停止の時点にのみ依存すると仮定します。カーネルは役に立ちません。この特別なケースに対する特別なサポートはありません。

あなたができることは、デバイスから一度読み込み、データをユーザースペースにコピーすることです。なぜデバイスにデータを再供給しようとするのですか?既に受け取ったので読んでください。出力を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)

関連情報