linux select函式用法詳解

2021-06-29 04:52:29 字數 2817 閱讀 2807

函式主要功能

呼叫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 並且這些函式...