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(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,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.