這裡介紹兩種機制,它們跟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...