fd_set的原理笔记

来源:互联网 发布:数据库的认识 编辑:程序博客网 时间:2024/06/14 17:10

define FD_SETSIZE      1024
typedef unsigned long   fd_mask;

#define NBBY    8              
#define NFDBITS (sizeof(fd_mask) * NBBY)       


#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是一个unsigned long数组,改数组的下标是howmany(FD_SETSIZE, NFDBITS)。

unsigned long是一个32位的数据可以和32个文件描述符一一对应,即每一个fd_set的数组变量其实是表示32个文件描述符的标志。

当我们传入文件描述符(fq)的时候,内核将文件描述数对32取整这样找到fd_set的数组下标,同时将改数组下标中对应的数据进行偏移并置为1,这样就达到了标记改文件描述符的目的。