どのようにソケットプログラミングのselect()関数を使用するには?
-
21-08-2019 - |
質問
プロトタイプがあります:
int select (int nfds,
fd_set *read-fds,
fd_set *write-fds,
fd_set *except-fds,
struct timeval *timeout);
私はかなりの時間のために、この機能を理解するのに苦労してきました。それは、FDSを書いて、0からnfds個-1に、すべてのファイルディスクリプタをチェックし、リードFDSを変更する場合は私の質問は、ある除く-FDSとき、私はセットにファイルディスクリプタを追加するためにFD_SETを使用する必要がありますなぜリターン、初めに、それはとにかく、すべてのファイルディスクリプタを確認するか、しないのだろうか?
解決
これはnfds
-0から1にチェックしません。最初の引数はどれだけ大きな、数値の上限を提供し、使用するファイル記述子があります。セット自体は実際に使用されているどのように多くのビットを知るための方法なしに、ビットベクトルとして表現されるかもしれないからです。個別の引数としてこれを指定すると、select()
が使用されていないファイルディスクリプタをチェックする避けることができます。
また、例えばしていないディスクリプタあなたはselect()
がすべてで確認されていない呼び出したときに読み取りが設定されているので、それがセットに表示されないことができ、コールから戻ると、どちらか。
他のヒント
私はかつてあなたと同じ疑問を持っていました。あなたは、次の質問と回答を見ることができます:
セレクトシステムコールの上のクエリ
所属していません StackOverflow