linux下select函式的使用

2021-05-24 09:07:00 字數 2177 閱讀 1034

先看下列的例子程式

#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...