select在WIN32和linux的实现

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,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值