13

ネットワーク プログラミングの本で説明されているように、select() は一連のファイル記述子の読み取りを監視します。たとえば、コードの一部を次に示します。

select(numfds, &read_fds, NULL, NULL, NULL);

これは、 read_fds numfds+ 1 のソケットの最大数です。すべての「モニター」サイクルselect()が、0 から numfds までのプロセスのすべてのファイル記述子を監視するということですか? つまり、監視するファイル記述子が 2 つ (0 と 26) しかない場合、select は 0 から 26 までのすべての記述子を監視しますか?

4

2 に答える 2

9

selectreadfds( 、writefds、 )で渡す fd セットに基づいて、監視する fd を選択しますexceptfds。セットは通常、ビット ベクトルとして実装されるためselect、ベクトルをスキャンしてどの fd が選択されているかを確認します。最select_ FD_SETSIZE_

selectを呼び出すたびにスキャンとセットをリセットする必要があるため、かなりコストのかかる呼び出しですselect。多くのプラットフォームでselectは、システム コールの上に実装されているだけでpoll、ファイル記述子を待機するためのより効率的なインターフェイスを提供します。

于 2013-02-04T22:13:32.267 に答える
6

すべての監視サイクルとは、オペレーティング システムが基本的にそれに近づくたびに、記述子を定期的にチェックするか、イベントまたは割り込みを介して処理することを選択できることを意味します。ソケット ファイル記述子でデータを受信すると、記述子ファイルにデータが入力され、それを待機していたプロセスに通知されます。これは、プロセスがすぐに起こされないため、すぐに実行されるとは限りません (select 呼び出しによってブロックされたため)。select 呼び出しがたまたま失敗した場合 (タイムアウトでデータを受信しなかった場合)、タイマーが起動し、プロセスを実行キューに戻します。

はい、0 ~ 26 の fdFD_SETがチェックまたは監視されます。これは、ファイル記述子の検索に上限を設定するためのものです。IIRC これは、fd_setスペースを節約できるため、インデックスを指定する方が簡単であるため、型が内部的にビットセットとして実装されているためです。しばらく glibc でそのコードにアクセスしていないため、前のステートメントは間違っている可能性があります。

于 2013-02-04T22:17:58.640 に答える