[b]contains:[/b]
[list]
[*]1、select
[*]2、poll
[/list]
[b]i/o復用模型使用在下列網路應用場合:[/b]
[list]
[*]1、當客戶處理多個fd時,必須使用i/o復用。
[*]2、乙個客戶同事處理多個套接字是可能的。
[*]3、如果乙個tcp伺服器處理多個socket。
[*]4、如果乙個伺服器處理多個協議。
[/list]
非阻塞i/o使我們可以呼叫open、read、write這樣的i/o操作,並使這些操作不會永遠阻塞。如果這種操作不能完成,則立即出錯返回,表示該操作如繼續執行將被阻塞。
對於乙個給定的fd有兩種方法對其指定[b]非阻塞i/o[/b]:
[list]
[*]1、如果呼叫open獲得描述符,則可制定o_nonblock標誌。
[*]2、對於已經開啟的乙個fd,則可呼叫fcntl,由該函式開啟o_nonblock檔案狀態標誌。
[/list]
[b]一、select函式[/b]
#include
#include
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
返回:若有就緒的fd則為其數目,若超時則為0,若出錯則為-1。
首先,介紹最後乙個引數:
[b]timeout[/b],它告知核心等待所指定描述符中的任何乙個就緒可花多長時間。
這個引數有三種可能:
[list]
[*]1、永遠等待下去:僅在有乙個fd準備好才返回。
[*]3、根本不等待:檢查描述符後立即返回,這稱為輪詢(polling)。
[/list]
中間的三個引數[b]read set[/b]、[b]writeset[/b]、[b]except set[/b]指定我們要讓核心測試[b]讀、寫和異常[/b]條件的fd
[b]maxfdp1[/b]引數制定待測試的fd個數,它的值是待測試的max fd+1.
select使用描述符集,通常是乙個整型陣列。對應fd。
[b]二、poll函式[/b]
#include
int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
返回:若有就緒的fd則為其數目,若超時則為0,若出錯則為-1。
[quote]與select不同,poll不是為每個狀態構造乙個描述符集,而是構造乙個pollfd陣列,每個陣列元素指定乙個描述符編號以及對其關心的狀態。[/quote]
struct pollfd ;
fdarray陣列中的元素數由nfds說明。
events fd感興趣的事件
revents fd已發生的事件
poll的最後乙個引數說明我們願意等待多少時間。如同select一樣,有三種不同的情形。
有關select和poll的區別
I O復用 select和poll函式 一
我們看到上面的tcp客戶同時處理兩個輸入 標準輸入和tcp套接字。我們遇到的問題就是在客戶阻塞於 標準輸入上的 fgets呼叫期間,伺服器程序會被殺死。伺服器tcp雖然正確地給客戶tcp傳送乙個fin,但是既然客戶程序阻塞於從標準輸入讀入的過程,它將看不到這個rof,知道從套接字讀時為止 可能已經過...
IO多路復用 select與poll
1.阻塞與非阻塞 阻塞方式block,程序執行到這一函式時必須等待事件發生,如果沒發生,就一直阻塞函式不能返回 非阻塞 non block 程序或執行緒執行不必等待事件發生一旦執行肯定返回以不停返回返回值來反應函式執 況 select就是這樣監視描述符的變化 2.select模型 兩結構體 stru...
第6章 I O復用 select和poll函式
如果乙個或多個 i o條件滿足,我們可以被通知到。場合 1.當客戶處理多個描述字時 2.乙個客戶同時處理多個套介面 3.乙個 tcp伺服器既要處理監聽套介面,又要處理已連線的套介面 4.乙個伺服器既要處理 tcp,又要處理 udp 5.乙個伺服器要處理多個服務或者多個協議 i o模型 l阻塞l 非阻...