初識select
系統提供select 函式來實現多路復用輸入/輸出模型
- select系統呼叫是用來讓程式監視多個檔案描述符的狀態變化;
- 程式會停在select這裡等待,直到被監視的檔案描述符有乙個或多個發生了狀態改變。
select 函式
函式原型:
#include int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *execptfds, struct timeval *timeout);
引數解釋:1. nfds:是需要監視的最大檔案描述符值+1;nfds 提高了遍歷的效率。
2. rdset,wrset,exset分別對應於需要檢測的可讀檔案描述符的集合、可寫檔案描述符的集合及異常檔案描述符的集合;fd_set 是基於位圖實現的結構體;*readfds 是讀就緒、*writefds 是寫就緒、*exceptfds 是異常就緒;
3. 引數 timeout 為結構 timeval,用來設定 select() 的等待時間。
引數timeout 的取值:
- null:表 select() 沒有 timeout,select 將一直被阻塞,直到某個檔案描述符上發生了事件。即按阻塞行為等待;
- 0:僅檢測檔案描述符集合的狀態,然後立即返回,並不等待外部事件的發生。即按非阻塞行為等待;
- 特定的時間值:如果在指定的時間段裡沒有事件發生,select() 就超時返回。
4. 第2,3,4這三個檔案描述符集既是輸入型引數也是輸出型引數。
- 呼叫時是輸入引數,表示我們關注的是哪些檔案描述符的讀狀態就緒、哪些檔案描述符的寫狀態就緒以及那些檔案描述符的異常狀態的就緒;對輸入引數進行新增或刪除操作。
- 是輸出引數,表示返回了哪些檔案描述符是可讀、哪些檔案描述符是可寫以及哪些檔案描述符是異常。對輸出引數進行判定。
select() 函式中所涉及的結構體:
1. 關於fd_set 結構體:
該結構體是基於位圖實現的,使用點陣圖中對應的位來表示要監視的檔案描述符。
提供了一組操做fd_set 的介面:
void fd_clr(int fd, fd_set *set); // 清除描述片語set中相關fd的位
void fd_isset(int fd, fd_set *set); // 測試描述片語set中相關fd的位是否為真
void fd_set(int fd, fd_set *set); // 設定描述片語set中相關fd的位
void fd_zero(fd_set *set); // 清空描述片語set
關於timeval 結構體:
timerval結構用來描述一段時間長度,如果在這個時間內,需要監視的檔案描述符沒有之間發生則函式返回,返回值為0。
the timeout
the time structures involved are defined in
struct timeval ;
socket就緒條件
讀就緒寫就緒
異常就緒
select 缺點:
I O多路轉接之select
什麼是i o多路轉接技術 先構建一張有關描述符的列表,然後呼叫乙個函式,直到這些描述符中的乙個已準備好進行i o時,該函式才返回,在返回時,他告訴程序哪些描述符已準備好可以進行i o。上述呼叫的函式,有select,poll,pselect及poll的增強版epoll等,本文主要介紹select。函...
I O多路轉接之select
下面的巨集提供了處理fd set的這三種描述集的方式 fd clr inr fd,fd set set 用來清除描述片語set中相關fd 的位 fd isset int fd,fd set set 用來測試描述片語set中相關fd 的位是否為真 fd set int fd,fd set set 用來...
IO多路轉接之select
系統提供select函式來實現多路轉接。呼叫select函式介面的特點 一次需要等待多個檔案描述符。select函式原型 include include include int select int nfds,fd set readfds,fd set writefds,fd set exceptf...