2017-02-14 1 views
0

私はLinuxに慣れていないので、パイプとバッファの仕組みを把握しようとしています。 私たちは、端末で以下を入力するとことをお読みください。Unix - 疑似端末を使ってバッファ戦略を変更するには?

command1 | command2 

それはのは、データの4Kを言わせて含まれている場合、バッファは、標準出力にフラッシュされます。 stackoverflowの How to make output of any shell command unbuffered?

上の別のポストから 私は1つのバッファを「オフ」または疑似端末を使用してバッファリングを行をバッファの戦略を変更することができることが分かりました。どのように実際にこの場合の擬似端末が機能し、擬似端末を使用してバッファ戦略を変更できるのはなぜですか?

ありがとうございました!

+1

「バッファ」とは何ですか?例えば標準的なC stdoutバッファ。 'printf'はデフォルトでバッファリングされていますか?パイプ自体が使用する下位レベルのバッファ?いくつかの他のカーネルレベルのバッファ? –

答えて

1

擬似端末を使用する理由は「動作します」というのは、stdioライブラリが出力が端末に向かい、使用するバッファリング方法を決定するかどうかを調べることです。擬似端末は端末と通信していると考えさせるので、「パイプ」戦略の代わりに端末戦略を選択します。

+0

これは、出力が端末に送られたときに常にラインバッファされていることを意味しますか? – newbie

+0

その場合は、ラインバッファされたものがデフォルトですが、プログラムは他のオプションを選択することができます。UNIXyシステムの場合は、詳細はman setvbufを参照してください。 –

1

単純なコマンドには多くの "バッファ"が含まれています。

  1. コマンドのコードの中にバッファリングが存在することがあります。たとえば、C I/Oを使用する場合、デフォルトで出力にはバッファがあります。コマンドがシステムI/Oを使用する場合、出力にはバッファリングがありません。
  2. パイプは、プロデューサ/コンシューマセマンティクスを提供する、何らかの種類のバッファリングを提供します。バイトは、1つの読取り値が読み取られるまでパイプに格納されます。
  3. パイプの最初のコマンドはttyから読み込み、最後はttyに書き込むことができます。また、ttysにはバッファを使用する回線規律があります。

あなたの視点から見れば、ユーザーが演奏できる唯一のものは端末の回線規律であり、提供された入力はできるだけ早く、あるいは何らかの料理やバッファリング。コマンドsttyを使用して、このすべてを制御できます。

0

バッファには4Kのデータが含まれていると、標準出力にフラッシュされます。

あなたはおそらく、悪名高い POSIX要件を参照しています。一定のサイズのパイプバッファをフラッシュすることではありません。

PIPE_BUFの要件は、複数のプロセスがそれぞれ同じパイプにPIPE_BUF未満を書き込んだ場合、異なるプロセスから混入した入力が表示されないことを保証することです。

は(ほとんどのシステムではデフォルトで4096少なくとも512ことが必要とされるが)PIPE_BUF4であると仮定し、2つのプロセスが同一のパイプに書き込む:両方のプロセスそれぞれが書いたので

ProcessA: write(pipe, "abcd", 4) 
ProcessB: write(pipe, "EFG", 3) 
ProcessC: read(pipe, buf, 7) 

4バイト以下の場合、受信者はabcdEFGまたはEFGabcdのいずれかを取得しますが、abEFGcdまたはEFabcdGは取得しません。

これは、「がPIPE_BUF未満の単一のものが、反対側の単一のread()で取得される」と間違って解釈されることがよくあります。

関連する問題