函式主要功能
呼叫select
函式,可以讓程序指示核心等待多個事件中的任意乙個發生,並使程序處於阻塞狀態,直到
select
引數指定的事情或者關心的事情發生時候,才喚醒程序,並且函式返回準備就緒的事件個數。
函式原型:
#include
int select(int maxfdp1 , fd_set*restrict readfds, fd_set *restrict writefds ,fd_set*restrict exceptfds, struct timeval*restruct tvptr);
select的引數主要告訴核心
1)我們關注的描述符(如socket
套接字返回的描述符)
2)對於每個描述符我們所關心的條件(
是否想從乙個給定的描述符讀,是否想寫乙個給定的描述符,是否關心乙個給定描述符的異常條件)
3)最長的等待時間
select函式返回的時候,核心告訴我們:
1)已經準備好的描述符的總數量
2)對於讀、寫、或者異常者3
個條件中的每乙個,有哪一些描述符是準備好的
引數解釋:
maxfd1是所有描述符中最大值的描述符
+1,這個引數告訴核心我們所關注的最大的描述符,
核心只需要在最大的描述符範圍內查詢開啟的位就可以。
timeval型別的引數
tvptr
執行select
函式等待時間發生的時間長度,
tvptr==null
的時候,表示永遠等待,當執行的描述符中有乙個已準備好時候等待狀態結束。
tvptr->tv_sec==0&&tvptr->tv_usec==0時,
select
不等待,測試完所以制定的描述符後立即返回,這是輪詢系統找到多個描述符而不阻塞
select
函式的方法
tvptr->tv_sec!=0||tvptr->tv_usec!=0 等待的時間
readfds,writefds,exceptfds;三個都是指向描述符集的指標,這
3個描述符集說明了我們關心的可讀、可寫或者處於異常條件的描述符集合,沒個描述符集合都儲存在
fd_set
資料型別中.
對於fd_set
資料型別,我們可以直接將它賦值給相同型別的資料型別,以及通過以下四個函式進行操作
#include
int fd_isset(int fd,fd_set* fset)
//判斷乙個檔案描述符是否在集合內
,在未呼叫
select
函式的時候,呼叫
fd_isset
時候,如果乙個檔案描述符在集合
fset
中,那麼返回真,否者返回假,如果已經呼叫了
select
函式,select
函式返回之後,如果檔案描述符
fd在集合
fset
中,並且檔案描述符已經準備好可以被讀或被寫,那麼呼叫
fd_isset
返回的是真,付過檔案符
fd有準備好,那麼即使
fd在集合
fset中,
fd_isset
返回的還是假
這裡「準備好」指的是程序可以直接對檔案描述符進行讀寫而不處於阻塞狀態,例如對於read
函式,如果當前可以從網路中讀取遠端發來的資料,那麼
read
所操作的檔案描述符就處於準備好的狀態,如果
read
沒有資料讀取,處於阻塞狀態,那麼
read
所操作的檔案描述符就沒有準備好
void fd_clr(int fd,fd_set*fset);//清除fd位
void fd_set(int fd,fd_set*fset);//將
fd新增到集合
fd_set中
void fd_zero(int fd,fd_set*fset);//清空
fd_set
#include#include#include/*程式目的:
驗證select函式監測的檔案描述符準備好可以被讀取時就立即返回,並且fd_set()相應的檔案描述符返回的是真,如果監測的檔案描述符沒有
準備好,返回的是假
*/int main()
if(fd_isset(stdout_fileno,&writefds))
/*2)使用select函式只監測stdin_fileno*/
/*呼叫之後,readfds和writefds都會被清空,以下進行驗證*/
if(fd_isset(stdin_fileno,&readfds))
else
//fd_set(stdin_fileno,&readfds);
/*單獨監測stdin_fileno,在規定的時間內如果標準輸入準備好(按回車)著輸出提示*/
fd_zero(&writefds);
readfds=temps;//temps以儲存readfds的值
max=max>stdin_fileno?max:stdin_fileno;
select(max+1,&readfds,&writefds,null,&tvptr);
if(fd_isset(stdin_fileno,&readfds))
else
return 0;
}
linux select函式用法
select系統呼叫是用來讓我們的程式監視多個檔案控制代碼的狀態變化的。程式會停在select這裡等待,直到被監視的檔案控制代碼有乙個或多個發生了狀態改變。關於檔案控制代碼,其實就是乙個整數,我們最熟悉的控制代碼是0 1 2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0 1 2是整數表示的,...
linux select函式用法
select系統呼叫是用來讓我們的程式 監視多個檔案控制代碼的狀態變化的。程式會停在select這裡等待,直到被監視的檔案控制代碼有乙個或多個發生了狀態改變。關於檔案控制代碼,其實就是乙個整數,我們最熟悉的控制代碼是0 1 2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0 1 2是整數表示的...
Linux select函式詳解
我們所關心的檔案描述符 對每個描述符,我們所關心的狀態。我們是要從乙個檔案描述符中讀或者寫,還是關注乙個描述符中是否出現異常 我們要等待多長時間。我們可以等待無限長的時間,等待固定的一段時間,或者根本就不等待 有了這些返回資訊,我們可以呼叫合適的i o函式 通常是read或 write 並且這些函式...