2

ソケット fd を FD_SET に追加するクライアントがあり、コードの後半で、この FD_SET で select() メカニズムを使用したいと考えています。「マスター」fd_set にアイテムがまったく含まれていない場合、select() の戻り値は何ですか? 「fdmax」パラメータはどうなりますか? 0?

セットが実際に空であるようなケースを処理する必要があります..特別なカウンターなしで暗黙的に処理できるかどうか疑問に思っています + if { }

4

2 に答える 2

3

それはうまくいくでしょう。

Linuxのマニュアルページには次のように記載されています。

一部のコードは、3つのセットすべてが空、nfdsがゼロ、およびNULL以外のタイムアウトを使用してselect()を呼び出し、サブ秒の精度でスリープするためのかなり移植性の高い方法です。

したがって、空のセットを使用しても何も奇妙なことはありません。セットは空にすることができ、それはそれらの定義の一部です。そして、はい、最大の記述子より1つ多く渡すことになっているため、0を渡す必要があります。

次のような記述子を追加する必要があるパーティにAPIを定義することをお勧めします。

int add_fds(FD_SET *set);

そして、1 +(追加された最大の記述子)を返すようにします。上記のように何も追加されなかった場合は0を返します。

戻り値はおそらく0になると、マニュアルページには次のように書かれています。

成功すると、select()とpselect()は、返された3つの記述子セットに含まれるファイル記述子の数(つまり、readfds、writefds、ただしfdsに設定されているビットの総数)を返します。タイムアウトが経過するとゼロになる場合があります。何か面白いことが起こる前に。

于 2013-02-27T10:41:04.490 に答える