linux socket中select()函數以及FD_ZERO FD_SET FD_CLR FD_ISSET,fd_zerofd_set

來源:互聯網
上載者:User

linux socket中select()函數以及FD_ZERO FD_SET FD_CLR FD_ISSET,fd_zerofd_set

linux socket非阻塞編程時常見到如下的code:

socket   s;   
.....   
fd_set   set;   

.....

struct timeval tv;
while(1)   
{       
      FD_ZERO(&set);//將你的套節字集合清空   
      FD_SET(s,   &set);//加入你感興趣的套節字到集合,這裡是一個讀資料的套節字s   

      tv.tv_sec = 3;
      tv.tv_usec = 0;
      select(maxfd+1,NULL,&set,NULL,&tv);//檢查套節字是否可讀,   
                                                        //很多情況下就是是否有資料(注意,只是說很多情況)  
                                                        //這裡select是否出錯沒有寫   

// timeout 時間為3s
      if(FD_ISSET(s,   &set)   //檢查s是否在這個集合裡面,   
      {                                           //select將更新這個集合,把其中不可讀的套節字去掉   
                                                  //只保留合格套節字在這個集合裡面                         
              recv(s,...);   
      }   
      //do   something   here   
}



    (1)FD_ZERO(&set);則set用位表示是0000,0000。
    (2)若fd=5,執行FD_SET(fd,&set);後set變為0001,0000(第5位置為1)
    (3)若再加入fd=2,fd=1,則set變為0001,0011
    (4)執行select(6,0,&set,0,&tv)阻塞等待
    (5)若fd=5發生可讀事件,則select返回,此時set變為0000,0011。注意:沒有事件發生的fd=5被清空。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.