作者godman362 (青)
看板NUU_CSIE
標題[心得] Async I/O (2)
時間Tue Aug 4 08:20:09 2009
拖了很久,一直蠻忙的
補習、弄專題什麼的,等等還要去開會,趁現在有空打一打
由於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