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,
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,
相关文章推荐
- linux使用select实现精确定时器详解
- linux下使用select实现精确定时器
- linux使用select实现精确定时器详解
- Linux下的定时器类实现(select定时+线程)
- linux 内核poll/select/epoll实现剖析(原理经典)
- [转]Linux 下给类tcp 通信模式的实现。select 函数
- Linux下的定时器类实现(select定时+线程)
- linux 内核poll/select/epoll实现剖析
- linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。
- Linux网络编程:TCP服务器(单进程多用户),使用select方法实现
- linux的I/O多路转接select的fd_set数据结构和相应FD_宏的实现分析
- Linux网络编程-select实现多点连接的回射
- linux 内核poll/select/epoll实现剖析
- linux下socket编程 select实现非阻塞模式多台客户端与服务器通信
- linux使用select实现精确定时器详解
- linux下使用select实现精确定时器
- linux使用select实现精确定时器详解
- Linux网络编程-select实现多点连接的回射
- Linux下select的用法--实现一个简单的回射服务器程序
- Linux下select&poll&epoll的实现原理(一)