1

SELECT_TUT から:

「...複数のファイル記述子を効率的に監視し、それらのいずれかが「準備完了」であるかどうかを確認するために使用されます。つまり、I / Oが可能になるかどうか、または「例外的な状態」が発生したかどうかを確認します記述子の... ...

では、select() のポイントは何ですか? 好きなときに記述子を読み書きすることはできませんか? select() のポイントは、複数の記述子を同時に監視し、アクティビティがない場合にプロセスを適切にスリープ状態にすることです。Unix プログラマーは、データ フローが断続的な複数のファイル記述子からの I/O を処理しなければならない状況に陥ることがよくあります。read(2) および write(2) 呼び出しのシーケンスを作成するだけの場合、呼び出しの 1 つがファイル記述子から/へのデータの待機をブロックする可能性があり、別のファイル記述子は I /O. select() はこの状況に効率的に対処します。」

誰かが私に、これが何を意味し、これがどのように機能するかを説明してもらえますか?

たとえば、ここではファイル ハンドルが 1 つだけ選択されていますが、なぜ監視が必要なのでしょうか?

my $timeout = 10;
my ( $in, $out ) = ( '', '' );
vec( $in, fileno( STDIN ), 1 ) = 1;
select( $out = $in, undef, undef, $timeout );
4

1 に答える 1

7

ファイルハンドルからの読み取りはブロック操作です。STDIN から読み取ろうとして入力がない場合、プログラムは入力があるまで待機します。入力なしで grep のようなフィルター プログラムを実行すると、その効果を確認できます。

$ grep foo
_

grep は入力を待ちます。何かを入力してCtl-dを押してSTDINを閉じると、grepの読み取りが入力を取得し、一致をチェックし、一致があれば一致を出力して終了します。

ここで、GUI メイン ループの実行中に複数の異なる接続から読み取る必要がある IRC クライアントのようなネットワーク アプリケーションを作成しているとします。これは select() が解決する問題です。

完全な説明を提供する記事は次のとおりです: http://www.perlfect.com/articles/select.shtml

于 2011-02-21T17:22:49.073 に答える