您的位置:首页 > 运维架构 > Linux

select在WIN32和linux的实现

2013-04-11 12:53 183 查看
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,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: