重複の可能性:
whileループをバッシングしてパイプから読み込みます。
私はWebプログラミングの背景知識があり、ローカルシェルの機能を使用することに興味があります。私が知っている限り、プログラムがファイルを読むときに必要な速度で読み取ることができます。しかし、プログラムがパイプを介して他のプログラムから入力を受け取り、それをリアルタイムで処理できない場合、どのように機能するのか疑問に思います。
良い例はビデオエンコーディングです。デコーダがビデオファイルを指し、その出力がエンコーダの入力にパイプされるとしましょう。デコードされた画像の合計サイズがメモリ+スワップ空間を超えるため、完全にバッファリングする方法はないようです。私はstdinとstdoutの読み取りと書き込みの呼び出しを見つけましたが、この例のエンコーダがすべてのデータを同時に処理できないときに実際に何が起こるのかを知りたいです。どういうわけかデコーダに必要な速度を教えてください。そのような信号に対してデコーダプログラムを特別に準備し、それに応じて処理速度を変更する必要がありますか?そうでなければ、最終的にバランスをとる方法は何ですか?
ベストアンサー1
ライターがパイプに書き込んでパイプがいっぱいになると(サイズは数キロバイトに制限されています)、リーダーの1つがスペースを解放するまでそのプロセスはブロックされます。同様に、リーダーがパイプからデータを読み取ると、そのプロセスは何かがあるまでブロックされます。
プログラマーがこれらの読み取りおよび書き込みをキューに追加するために使用できる非同期書き込みおよび読み取りもあります。
私は読書を強くお勧めしますBeejのご案内、Beejから始まるUnix プロセス間通信ガイド
2つのパラメータを使用してそれを呼び出します。最初は作成者の睡眠時間、2番目は読者の睡眠時間です。 argsを試してください0 3
。3 0
#!/bin/sh
write_sleep=$1
read_sleep=$2
writer(){
echo writing output >&2
echo hi
sleep $write_sleep
echo writing output >&2
echo hi
sleep $write_sleep
echo writing output >&2
echo hi
sleep $write_sleep
}
reader(){
while true; do
echo getting input >&2
read input
[ $input ] || { echo input is empty >&2 && break; }
echo $input
sleep $read_sleep
done
}
writer | reader