ソケット fd を FD_SET に追加するクライアントがあり、コードの後半で、この FD_SET で select() メカニズムを使用したいと考えています。「マスター」fd_set にアイテムがまったく含まれていない場合、select() の戻り値は何ですか? 「fdmax」パラメータはどうなりますか? 0?
セットが実際に空であるようなケースを処理する必要があります..特別なカウンターなしで暗黙的に処理できるかどうか疑問に思っています + if { }
ソケット fd を FD_SET に追加するクライアントがあり、コードの後半で、この FD_SET で select() メカニズムを使用したいと考えています。「マスター」fd_set にアイテムがまったく含まれていない場合、select() の戻り値は何ですか? 「fdmax」パラメータはどうなりますか? 0?
セットが実際に空であるようなケースを処理する必要があります..特別なカウンターなしで暗黙的に処理できるかどうか疑問に思っています + if { }
それはうまくいくでしょう。
Linuxのマニュアルページには次のように記載されています。
一部のコードは、3つのセットすべてが空、nfdsがゼロ、およびNULL以外のタイムアウトを使用してselect()を呼び出し、サブ秒の精度でスリープするためのかなり移植性の高い方法です。
したがって、空のセットを使用しても何も奇妙なことはありません。セットは空にすることができ、それはそれらの定義の一部です。そして、はい、最大の記述子より1つ多く渡すことになっているため、0を渡す必要があります。
次のような記述子を追加する必要があるパーティにAPIを定義することをお勧めします。
int add_fds(FD_SET *set);
そして、1 +(追加された最大の記述子)を返すようにします。上記のように何も追加されなかった場合は0を返します。
戻り値はおそらく0になると、マニュアルページには次のように書かれています。
成功すると、select()とpselect()は、返された3つの記述子セットに含まれるファイル記述子の数(つまり、readfds、writefds、ただしfdsに設定されているビットの総数)を返します。タイムアウトが経過するとゼロになる場合があります。何か面白いことが起こる前に。