2

プロトタイプは次のとおりです。

int select (int nfds,
            fd_set *read-fds,
            fd_set *write-fds,
            fd_set *except-fds,
            struct timeval *timeout);

私はかなり長い間、この機能を理解するのに苦労してきました。私の質問は、0 から nfds-1 までのすべてのファイル記述子をチェックし、返されたときに read-fds、write-fds、および except-fds を変更する場合、FD_SET を使用してファイル記述子をセットに追加する必要があるのはなぜですか?最初に、とにかくすべてのファイル記述子をチェックしますか?

4

2 に答える 2

2

0 からnfds-1 まではチェックしません。最初の引数は、使用されるファイル記述子が数値的にどのくらい大きいかの上限を提供するだけです。これは、実際に使用されているビット数を知る方法がなくても、セット自体がビットベクトルとして表される可能性があるためです。これを別の引数として指定するとselect()、使用されていないファイル記述子のチェックを回避できます。

また、呼び出し時に読み取りセットなどにない記述子はselect()まったくチェックされないため、呼び出しが返されたときにもセットに表示されません。

于 2009-05-12T08:41:19.603 に答える
0

私はかつてあなたと同じ疑問を持っていました。次の質問と回答をご覧ください。

Select システム コールのクエリ

于 2009-05-12T09:02:06.213 に答える