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,
發佈了17 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章