先看下列的例子程式
#include
#include
#include
#include
#define stdin 0
#define true 1
#define false 0
#define ulong unsigned long
static struct timeval timelast;
static volatile char tmoutenable;
void timeenable()
void timerece( )//毫秒定時器
else
} }int isready(int fd)
else
timerece();
return rs; }
int main()
select函式用來查詢裝置是否可讀寫,或是否處於某種狀態。
select()函式說明:
select()函式的介面主要是建立在結構'fd_set'的基礎上。'fd_set' 是一組檔案描述符(fd)的集合。由於fd_set型別的長度在不同平台上不同,所以linux用一組標準的巨集定義來處理此類變數:
fd_set set;
fd_zero(&set); /* 將set清零 */
fd_set(fd, &set); /* 將新的檔案描述符fd加入set */
fd_clr(fd, &set); /* 將fd從set中清除 */
fd_isset(fd, &set); /* 如果fd在set集中,則返回真 */
不同系統平台,乙個fd_set集的最大描述符不同,不過你可以通過sizeof(fd_set) 的返回來判斷你的平台上支援多少個檔案描述符。在 linux中,sizeof(fd_set)的結果是128 * 8 = fd_setsize=1024)
select函式原型:
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout);
注釋:
n
需要檢查的檔案描述符個數,n應該比是三組fd_set---(readfds,writefds,exceptfds)中最大數
更大,而不是實際檔案描述符的總數。
readset
用來檢查可讀性的一組檔案描述符。
writeset
用來檢查可寫性的一組檔案描述符。
exceptset
用來檢查意外狀態的檔案描述符。(注:錯誤並不是意外狀態)
timeout
等待最長時間,如果timeout==null,則進入無限期等待,如果其中tv_sec和tv_usec都等於0, 則檔案描述符
的狀態不被影響,但函式並不掛起
返回值是返回響應操作的對應操作檔案描述符的總數,且三組資料均在恰當位置被修改,只有響應操作的那一些沒有修改。可用fd_isset巨集來查詢此操作符(參考上例子)。
當然如果我們把null指標作為fd_set傳入的話,這就表示我們對這種操作的發生不感興趣,但select() 還是會等待直到其發生或者超過等待時間,不過我想這樣沒什麼意義吧。。
參考:
linux下select呼叫的過程:
1.使用者層應用程式呼叫select(),底層呼叫poll())
2.核心層呼叫sys_select() ------> do_select()
最終呼叫檔案描述符fd對應的struct file型別變數的struct file_operations *f_op的poll函式。
poll指向的函式返回當前可否讀寫的資訊。
1)如果當前可讀寫,返回讀寫資訊。
2)如果當前不可讀寫,則阻塞程序,並等待驅動程式喚醒,重新呼叫poll函式,或超時返回。
3.驅動需要實現poll函式。
當驅動發現有資料可以讀寫時,通知核心層,核心層重新呼叫poll指向的函式查詢資訊。
poll_wait(filp,&wait_q,wait) // 此處將當前程序加入到等待佇列中,但並不阻塞
在中斷中使用wake_up_interruptible(&wait_q)喚醒等待佇列
2011-02-2420:50:13
linux下的Select函式
part1 fd set errorfds同上面兩個引數的意圖,用來監視檔案錯誤異常。struct timeval timeout是select的超時時間,這個引數至關重要,它可以使select處於三種狀態,第一,若將null以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視...
Linux下select函式的使用
一.select 函式詳細介紹 負值 select錯誤 正值 某些檔案可讀寫或出錯 0 等待超時,沒有可讀寫或錯誤的檔案 在有了select後可以寫出像樣的網路程式來!舉個簡單的例子,就是從網路上接受資料寫入乙個檔案中。main select等待3秒,3秒輪詢,要非阻塞就置0 char buffer...
Linux下select函式的使用
一.select 函式詳細介紹 負值 select錯誤 正值 某些檔案可讀寫或出錯 0 等待超時,沒有可讀寫或錯誤的檔案 在有了select後可以寫出像樣的網路程式來!舉個簡單的例子,就是從網路上接受資料寫入乙個檔案中。main select等待3秒,3秒輪詢,要非阻塞就置0 char buffer...