select在win32下和linux下实现是不一样的,由其是fd_set这个数据结构的构造.
linux下
select的实现
select中的第一个参数,是给系统内部用的, nfds is the highest-numbered file descriptor in any of the three sets, plus 1.
win32下
select的实现
宏FD_SET的实现
#define FD_SET(fd, set) do { \
u_int __i; \
for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \ // 遍历set的集合中,找到是否已经FD_SET该fd,找到后退出循环,继续下面的操作.
break; \
} \
} \
if (__i == ((fd_set FAR *)(set))->fd_count) { \ // 如果没有找到已经 FD_SET的fd,判断该fd<FD_SETSIZE后,在fd_set的数据组加入该fd,并且fd_set中fd_count加1
if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
((fd_set FAR *)(set))->fd_array[__i] = (fd); \
((fd_set FAR *)(set))->fd_count++; \
} \
} \
} while(0)
疑问:在如下条件下,set中已经FD_SET一个描述符fd=3(0,1,2是stdout,stdin,stderr),此时fd_count==1,第二次再次FD_SET该描述符fd=3,第一次遍历时已经找到了fd_array[__i==0]=3, 此时__i==1,__i==fd_count,此时fd=3又加到set中去了,fd_array[__i==1]=3,fd_count=2.
一个集合中就出来了存在两个相同的fd,