1

IPC::Open3のドキュメントには次のように記載されています。

The CHLD_IN will have autoflush turned on

しかし、ソースコードには何も言及されていませんIO::Handle::autoflush。の autoflush をオンにするために、モジュールはどのメカニズムを使用しCHLD_INますか?

4

1 に答える 1

2

次の行でバッファリングを無効にします

select((select($handles[0]{parent}), $| = 1)[0]); # unbuffer pipe

これは次のように書き直すことができます

my $old_fh = select($handles[0]{parent});
$| = 1;
select($old_fh);

Perl で出力バッファリングを無効にする従来の方法は、$|変数を使用することです。からman perlvar:

  • HANDLE->autoflush( EXPR )
  • $OUTPUT_AUTOFLUSH
  • $|

ゼロ以外に設定すると、現在選択されている出力チャネルで書き込みまたは印刷を行うたびに、すぐに強制的にフラッシュします。デフォルトは 0 です (チャネルがシステムによって実際にバッファリングされているかどうかに関係なく; $| は、Perl に各書き込み後に明示的にフラッシュするように要求したかどうかだけを示します)。STDOUT は通常、出力が端末への場合はライン バッファリングされ、それ以外の場合はブロック バッファリングされます。この変数の設定は、主にパイプまたはソケットに出力する場合に役立ちます。たとえば、rsh で Perl プログラムを実行していて、その出力を確認したい場合などです。これは、入力バッファリングには影響しません。それについては getc を参照してください。出力チャネルの選択方法については、select を参照してください。IO::ハンドルも参照してください。

記憶法: パイプを熱くしたいとき。

設定$|は、 の 1 つの引数形式で設定された「現在選択されている出力チャネル」に作用しますselect

于 2016-12-11T10:41:40.387 に答える