看板 NUU_CSIE 關於我們 聯絡資訊
拖了很久,一直蠻忙的 補習、弄專題什麼的,等等還要去開會,趁現在有空打一打 由於poll的效能不是很好,所以我就不做介紹 等等有時間的話再談為什麼效能不好,他要牽扯到一些OS的觀念 所以接下來我要講的是select的用法: select(int maxfd, fd_set *Read, fd_set *Write, fd_set *Except, timeval *timeout) 以上是select的函數參數 首先,會看到完全不認識的兩個資料型態:fd_set, timeval fd_set是一個放fd的地方,也就是說他是一個fd的集合 將你要處理的fd丟入這個集合之中,傳給select當參數 再由select去幫你看這個fd_set中的fd是否已經準備好可以傳、寫資料 對fd的操作,有以下幾種方式: FD_ZERO:對宣告出來的fd_set做初始化,一定要做 FD_SET:將fd丟進自己宣告的fd_set中 FD_CLR:將fd從指定的fd_set移除 FD_ISSET:判斷此fd是否在該fd_set中準備好傳、寫資料 底下來個使用範例: FD_ZERO(&Readset); FD_SET(0, &Writeset); FD_CLR(1, &Readset); if (FD_ISSET(0, &Writeset)) { ... } 接著,來說明timeval的意義 在最後一個參數,是用來放timeout時間 簡單說,就是要讓select對此有準備好的fd等待多久時間 若該fd準備好,但是不動作的話,最多只會等待timeout的時間 時間到後,則不予理會,往下一個準備好的fd動作 該fd則須等待到下一輪才可再動作,以下來個例子: timeval timeout; timeout.tv_sec = 0; //秒 timeout.tv_usec = 10000; //微秒 再來談select的return value return value正常來說會有三種: < 0:發生signal interrupt該process = 0:發生timeout > 0:有 > 0個fd已經準備好可以動作(包涵讀寫) 同樣,來一個使用範例: ret = select(FD_SETSIZE, &read, &write, &except, &timeout); 因為select只檢查一次 所以如果是用來寫網路的話,要用infinite loop去包起來 其中,fd_set的資料在一次select之後,會全部清光 必須重新自己再assign 所以必須在select之前,再重新給予fd_set的fd 以上,補完 下次見。 (開會ing.....) -- 要感謝的人太多了,那就謝天吧 要改得程式碼太多了,那就改天吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.4.78