2016-06-24 5 views
2
選択
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout); 

の最初のパラメータは、ここで私はウィキから得るものです:Linuxの場合:最初のパラメータ<code>nfds</code>については

これは整数 のいずれかにおける任意のファイルディスクリプタの最大値よりも1ですセット。つまり、ファイルディスクリプタを各セットの に追加している間に、 のすべての最大整数値を計算してから、この値を1ずつ増やしてから、これをnfdsとして渡す必要があります。私はプロセスに複数のソケットを持っている場合は、selectの最初のパラメータを設定する方法を、

は、私は簡単な質問がありますか?

最大のソケット番号+1で設定する必要がありますか?

もしそうなら、selectは最大のソケット番号+ 1より小さいすべてのファイル記述子をリッスンしていますか?

たとえば、私は3つのソケット111,222,333を持っています。最初のパラメータを334に設定すると、0から333までのファイル記述子をすべて聴いていますか?

+0

は古い投稿の重複のようです: http://unix.stackexchange.com/questions/7742/whats-the-purpose-of-the-first-arg-to-select-system-call – eyalm

答えて

0

最大ソケット番号+1で設定する必要がありますか?

はい!

もしそうなら、selectはファイル のすべてのファイルを最大のソケット番号+ 1よりも小さく聞いていますか?私が設定された場合111、222及び333:

いいえ、それだけたとえば readfds、writefds、およびexceptfds

に記載されているfd_setsにその動作を行う、私は3つのソケットを有します 最初のパラメータを334とすると、0から333までのファイル のすべてをリッスンしていますか?アップビットを3ビットセットごとに1に設定し、その後のいずれかの場合している3ビットマップを設定しますsys_select内部

いいえ、あなただけの111の$を選択$を行っている、222と333

これらのビットがセットされ(ファイルディスクリプタの動作を腐食する)、次にwait_key_setの操作が実行されます。

このインターフェイスの理由は、カーネル内では非常に予測可能なforループになります。一緒に働くことはかなり安全です。カーネル内で計算をやろうとするのではなく、

関連する問題