0

perl の open2 perldoc : http://perldoc.perl.org/IPC/Open2.html 記述:

あなたが永遠にブロックするかもしれないので、彼の事件全体は非常に危険です. bc のようなものと通信することを想定しています .... ... CPAN の IO::Pty および Expect モジュールは、実際の tty (実際には疑似 tty) を提供するため、これに役立ちます。呼び出されたコマンドの行バッファリングに戻ります。

しかし、IO::Pty および Except モジュールが open2 の問題を解決できる理由がわかりません。

ところで、open2 から返された FileHandler は noblocking で読み取れるのでしょうか?

どうもありがとう !

4

1 に答える 1

0

バッファI/Oを使用した場合、データはバッファがいっぱいになるまでファイルハンドルを介して送信されません。これは、ユーザーがEnterキーを押すと回線が送信される端末I/Oとは異なります。したがって、ユーザーであるかのようにプログラムと対話するプログラムを作成している場合、バッファリングされたI/Oによって問題が発生する可能性があります。たとえば、プログラムは、相手側がデータを受信して​​応答を出力することを期待して、データの行を送信できます。ただし、応答を待つときにそのデータ行が出力バッファーに残っていると、デッドロックが発生します。プログラムは、出力バッファーに残っている入力を待っているプログラムからの応答を待っています。

ptyを使用してプログラムと対話すると、ラインバッファリングを(双方向で)使用できるため、ストリームで改行が検出されるとデータが送信されます。

また、任意のファイルハンドルを非ブロッキング方式で読み取ることができselectます。そのファイルハンドルで使用可能なデータがあるかどうかを判断するために使用するだけです。

この記事は物事を説明するのに役立つかもしれません:http ://www.pixelbeat.org/programming/stdio_buffering/

于 2012-10-03T16:57:12.027 に答える