fd_set是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:
fd_set set;
FD_ZERO(&set); /* 将set清零使集合中不含任何fd*/
FD_SET(fd, &set); /* 将fd加入set集合 */
FD_CLR(fd, &set); /* 将fd从set集合中清除 */
FD_ISSET(fd, &set); /* 测试fd是否在set集合中*/
过去,一个fd_set通常只能包含<32的fd(文件描述字),因为fd_set其实只用了一个32位矢量来表示fd;现在,UNIX系统通常会在头文件中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是1024,这样就能表示<1024的fd。根据fd_set的位矢量实现,我们可以重新理解操作fd_set的四个宏:
fd_set set;
FD_ZERO(&set); /*将set的所有位置0,如set在内存中占8位则将set置为
00000000*/
FD_SET(0, &set); /* 将set的第0位置1,如set原来是00000000,则现在变为10000000,这样fd==1的文件描述字就被加进set中了 */
FD_CLR(4, &set); /*将set的第4位置0,如set原来是10001000,则现在变为10000000,这样fd==4的文件描述字就被从set中清除了 */
FD_ISSET(5, &set); /* 测试set的第5位是否为1,如果set原来是10000100,则返回非零,表明fd==5的文件描述字在set中;否则返回0*/
―――――――――――――――――――――――――――――――――――――――
注意fd的最大值必须
―――――――――――――――――――――――――――――――――――――――
在NIOSI IDE集成开发环境中的SOCKET.H中这样定义;
#ifndef FD_SET
#undef FD_SETSIZE
#define FD_SETSIZE 16
#define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7)))
#define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7)))
#define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7)))
#define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p)))
typedef struct fd_set {
unsigned char fd_bits [(FD_SETSIZE+7)/8];
} fd_set;
其中P是一个fd_set类型的指针.
使用时:
fd_set readfds;
int fd_listen;
fd_listen = socket(AF_INET, SOCK_STREAM, 0);
FD_ZERO(&readfds);
FD_SET(fd_listen, &readfds);
最近才开始看这个东西,感觉不同平台上的LWIP的定义也有很多不同.
在NIOSII中定义是不是可以这样理解?
fd_bits数组只有两个元素,
FD_ZERO(&readfds); 是将分配一个内存空间给readfds,并初始化为0.
FD_SET(fd_listen, &readfds); 在readfds将fd_listen所在位置1.
http://www.eefocus.com/zhanghh624/blog/08-11/159757_0d876.html