非同期ソケットベース:select関数およびFD_ZERO、FD_SET、FD_CLR、FD_ISSET使用説明(ZZ)

2886 ワード

FD_SETオープンタイプfd_setのどちらかのFD_ZERO初期化fd_setFD_ISSET試験構造fd_setの記述語はvc 98/includeのファイルに直接検索するとコードが見つかります.
select関数:システムはselect関数を提供して多重入出力モデルを実現する.原型:#include #include         
int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); パラメータmaxfdは、監視が必要な最大のファイル記述子値+1である.rdset,wrset,exsetは,それぞれ検出が必要な可読ファイル記述子の集合,書き込み可能ファイル記述子の集合,および異常ファイル記述子の集合に対応する.struct timeval構造は、時間の長さを記述するために使用され、この時間内に監視する必要がある記述子がイベントが発生しなければ関数が返され、戻り値は0です.FD_ZERO,FD_SET,FD_CLR,FD_ISSET:パラメータmaxfdは監視が必要な最大のファイル記述子値+1である.rdset,wrset,exsetは,それぞれ検出が必要な可読ファイル記述子の集合,書き込み可能ファイル記述子の集合,および異常ファイル記述子の集合に対応する.struct timeval構造は、時間の長さを記述するために使用され、この時間内に監視する必要がある記述子がイベントが発生しなければ関数が返され、戻り値は0です.FD_ZERO,FD_SET,FD_CLR,FD_ISSET: FD_ZERO(fd_set *fdset);指定したファイル記述子セットを空にするには、ファイル記述子セットを設定する前に初期化する必要があります.空にしないと、システムがメモリスペースを割り当てた後、通常は空にしないため、結果はわかりません.FD_SET(fd_set *fdset);ファイル記述子セットに新しいファイル記述子を追加するために使用します.FD_CLR(fd_set *fdset);ファイル記述子セットからファイル記述子を削除します.FD_ISSET(int fd,fd_set *fdset);指定したファイル記述子がセットにあるかどうかをテストします.struct timeval構造:struct timeval{long tv_sec;//second long tv_usec;//minisecond}timeout設定:null:selectは、ファイル記述子にイベントが発生するまでブロックされます.0:記述子セットの状態のみを検出し、外部イベントの発生を待たずにすぐに戻ります.特定の時間値:指定した時間帯にイベントが発生しない場合、selectはタイムアウトして返されます.
 
('fd_set')は、ファイル記述子(fd)のセットです.fd_setタイプの長さは異なるプラットフォームで異なるため、標準的なマクロ定義のセットでこのような変数を処理する必要があります.
fd_set set;   
FD_ZERO(&set); /* set */
FD_SET(fd, &set); /* fd set */
FD_CLR(fd, &set); /* fd set */
FD_ISSET(fd, &set); /* fd set  */

過去にはfd_setは、fd_setは実際にはintのビットベクトルだけで実現され、多くの場合、fd_をチェックするset任意の値を含むファイル記述子はシステムの責任ですが、fd_を確定します.setはどれだけ置くことができますか?マクロFDをチェック/変更する必要があります.SETSIZEの値.*この値はシステムに関連する*であり、あなたのシステムのselect()のmanマニュアルを確認します.1024以上のファイル記述子のサポートに問題があるシステムもあります.
fd_set具体的にどのように実現したのか
これはfd_set関連のソースコードをまとめます.これでfd_がわかるはずsetの実現詳細原理
define FD_SETSIZE      1024typedef unsigned long   fd_mask;
#define NBBY    8              /* number of bits in a byte */#define NFDBITS (sizeof(fd_mask) * NBBY)       /* bits per mask */
#define howmany(x, y)   (((x) + ((y) - 1))/(y))
typedef struct fd_set {        fd_mask   fds_bits[howmany(FD_SETSIZE, NFDBITS)];} fd_set;
#define _fdset_mask(n)   ((fd_mask)1 << ((n) % NFDBITS))#define FD_SET(n, p)     ((p)->fds_bits[(n)/NFDBITS] |= _fdset_mask(n))#define FD_CLR(n, p)     ((p)->fds_bits[(n)/NFDBITS] &= ~_fdset_mask(n))#define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & _fdset_mask(n))#define FD_COPY(f, t)    bcopy(f, t, sizeof(*(f)))#define FD_ZERO(p)      bzero(p, sizeof(*(p)))
fd_set master_set_read;
FD_SET(600,master_set_read);
=>  master_set_read->fds_bits[(600)/32] |= (1<<(600%32)); 
テキストアドレスhttp://mawnja.blog.163.com/blog/static/212061982008684928510/