select在WIN32和linux的实现

来源:互联网 发布:淘宝模特一分钟摆姿势 编辑:程序博客网 时间:2024/05/18 01:30
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(fdsetdo { \
    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,
原创粉丝点击