高階輪詢技術 dev poll介面與kqu

2021-06-18 00:06:12 字數 2394 閱讀 2288

這裡介紹兩種機制,它們跟select和poll這兩個函式具備類似的特性。

/dev/poll介面

solaris上名為/dev/poll的特殊檔案提供了乙個可擴充套件的輪詢大量描述符的方法。select和poll存在的乙個問題是,每次呼叫它們都得傳遞待查詢的檔案描述符。輪詢裝置能在呼叫之間維持狀態,因此輪詢程序可以預先設定好待查詢描述符的列表,然後進入乙個迴圈等待事件發生,每次迴圈回來時不必再次設定該列表。

開啟/dev/poll之後,輪詢程序必須先初始化乙個pollfd結構(即poll函式使用的結構,不過本機制不使用其中的revents成員)陣列,再呼叫write往/dev/poll裝置上寫這個結構陣列以把它傳遞給核心,然後執行dp_poll命令阻塞自身以等待事件發生。

傳遞給ioctl呼叫的結構如下:

struct

dvpoll ;

其中dp_fds成員指向乙個緩衝區,供ioctl在返回時存放乙個pollfd結構陣列。dp_nfds成員指定該緩衝區。ioctl呼叫將一直阻塞到任何乙個被輪詢描述符上發生所關心的事件,或者流逝時間超過經由dp_timeout成員指定的毫秒數為止。dp_timeout指定為0將導致ioctl立即返回,從而提供了使用本介面的非阻塞手段。dp_timeout指定為-1表示沒有超時設定。

以下利用/dev/poll機制對函式str_cli進行改編。

#include

"unp.h"

#include

void

str_cli(file *fp, 

intsockfd)

write(fileno(stdout), buf, n);

} else

writen(sockfd, buf, n);} }

} }

kqueue介面

freebsd引入了kqueue介面。本介面允許程序向核心註冊描述所關注kqueue事件的事件過濾器。事件除了與select所關注類似的檔案i/o和超時外,還有非同步i/o、檔案修改通知(例如檔案被刪除或修改時發出的通知)、程序跟蹤(例如程序呼叫exit或fork時發出的通知)和訊號處理。kqueue介面有如下兩個函式和乙個巨集。

#include

#include

#include

intkqueue(

void);

intkevent(

intkq,

const

struct

kevent *changelist,

intnchanges,

struct

kevent

*eventlist,

intnevents,

const

struct

timespec

*timeout);

void

ev_set(

struct

kevent

*kev,uintptr_t ident,

short

filter,

u_short flags,

u_int

fflags,

intptr_t data,

void

*udata);

kqueue函式返回乙個新的kqueue描述符,用於後續的kevent呼叫中。kevent函式既用於註冊所關注的事件,也用於確定是否有所關注的事件發生。changelist和nchanges這兩個引數給出對所關注事件做出的更改,若無更改則分別取值null和0。如果nchanges不為0,kevent函式就執行changelist陣列中所請求的每個事件過濾器更改。其條件已經觸發的任何事件(包括剛在changelist中增設的那些事件)由kevent函式通過eventlist引數返回,它指向乙個由nevents個元素構成的kevent結構陣列。kevent函式在eventlist中返回的事件數目作為函式返回值返回,0表示超時。超時通過timeout引數設定,其處理類似select:null阻塞程序,非0值timespec指定明確的超時值,0值timespec執行非阻塞事件檢查。注意,kevent使用的timespec結構不同於select使用的timeval結構,前者的解析度為納秒,後者的解析度為微秒。

kevent結構在標頭檔案中定義:

struct

kevent ;

其中的flags成員在呼叫時指定過濾器更改行為,在返回時額外給出條件,如下圖所示。

filter成員指定的過濾器型別如下圖所示。

以下利用kqueue機制對函式str_cli進行改編。

void

str_cli(file *fp, 

intsockfd)

write(fileno(stdout), buf, n);

} if(kev[i].ident == fileno(fp)) 

} } } }

關於輪詢技術

1.輪詢 瀏覽器不斷地向伺服器返送ajax請求。配合使用定時函式 setinterval 或者 settimeout 定時傳送ajax請求。2.長輪詢 comet 輪詢是不斷地傳送ajax,而長輪詢是瀏覽器傳送一次ajax之後,伺服器會去搜尋資料 資料庫等等 如果伺服器沒有搜尋到資料,那麼就不會響應...

輪詢介面進行訊息提示

一 輪詢服務啟動 public class newtaskservice extends service override public void oncreate override public void onstart intent intent,int startid targetapi bu...

DNS輪詢技術的應用

歡迎瀏覽我的部落格 實驗應用 dns使用 輪詢技術 把不同的訪問使用者導向不同的web伺服器,從而實現簡單的負載平衡實驗說明 客戶機在訪問web伺服器時需要先利用dns伺服器把網域名稱解析為ip。例如當第乙個客戶機查詢www.ytvc.com時,dns伺服器會告訴客戶機這個網域名稱對應的ip是192...