2017-10-25 8 views
1

私はfooとbarという2つのコマンドがあるとします。コマンドラインの非同期パイプ

fooの出力がbarの入力に「リダイレクト」されるように両方を実行したいとします。しかし、それだけではなく、fooの出力ストリームに書き込まれた各バイトを、バーの入力ストリームに直接/即座に書き込むようにしたいと考えています。バーは、その入力ストリームの読み込みを開始する前に

foo | bar 

はその後、fooは/終了を終了する必要があります:私はコマンドを使用している場合

。 fooが出力ストリームを書き込むのと同時にbarが入力ストリームの読み込みを開始します。

Thisここで、私が正しく理解すると、パイプでバッファリングされたバイト数に制限があり、パイプが満たされたときに、パイプがバーの入力ストリームに「フラッシュされる」ことがあります。何とか「1」に減らすことができますか?

+0

次のコマンドは、fooの出力をバッファリングしません。両方のプログラムをコントロールできますか? 'bar.exe'だけを制御できれば、何もできないのではないかと恐れています。 –

+0

unix [link](http://vincebuffalo.org/blog/2013/08/08/using-names-pipes-and-process-substitution-in-bioinformatics.html)に名前付きパイプがありますが、私は持っていませんWindowsで同様のことを聞いた – dimirsen

+0

@dimirsen名前付きパイプをバッファしないようにする方法はありますか? –

答えて

5

あなたは書きました:

foobar開始は、その入力ストリームを読む前に/退出を終了する必要があります。私は、fooがその出力ストリームを書き込むのと同時に、barがその入力ストリームの読み込みを開始したいと思います。

仮定は正しくありません。 fooは、出力がbarに渡される前に終了する必要はありません。 Trueは、glibc(foobarの両方がリンクされていると仮定します)が出力バッファリングを実行することです。 fooの出力が端末に送られない限り、出力はバッファに書き込まれ、このバッファは一定のサイズに達するとフラッシュされます。 fooの出力が小さすぎてバッファー・サイズに達しない場合は、はい、バッファーは一旦fooが終了するとフラッシュされます。

stdbufコマンドを使用してバッファサイズを調整できます。私はあなたの問題は同期に比べ、バッファI/Oに複数の関連だと思い

stdbuf -o0 foo | bar 
関連する問題