2023年12月23日 by: bob2. 函式原型和引數說明
3. 一般使用步驟
三、demo
select函式的作用
select函式用來統一監視多個檔案描述符,監視的內容包括:
是否存在套接字接收資料?
無需阻塞傳輸資料的套接字有哪些?
哪些套接字發生了異常?
獲知了以上資訊就可以進行針對性操作
特點
select函式是非阻塞的,可以設定超時時間
select函式可以監視多個檔案描述符
1.1 結構體介紹
這個結構體通過掩膜的方式來儲存檔案描述符的資訊,實際上是乙個long型別的陣列;比如該結構體的第乙個bit(0號bit),代表0號檔案描述符,即標準輸入。
1.2 操作結構體相關的巨集
這些巨集的實現本文不介紹,只涉及使用
fd_set
(int fd, fd_set *fdset)
;//將fd加入set集合
fd_clr
(int fd, fd_set *fdset)
;//將fd從set集合中清除
fd_isset
(int fd, fd_set *fdset)
;//檢測fd是否在set集合中在則返回非0值,不在則返回0
fd_zero
(fd_set *fdset)
;//將set清零使集合中不含任何fd
函式原型:
int
select
(int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds,
struct timeval * timeout)
;
引數說明int n
: 集合中所有檔案描述符的範圍,select函式只會監視小於n(大於等於0)的檔案描述符。應填寫所有檔案描述符的最大值加1
fd_set * readfds
: 這個指標作為引數傳入函式時,包含了要監視是否可以讀取資料的檔案描述符,函式返回時將可以讀取的檔案描述符對應的bit保持置1,否則置0
fd_set * writefds
: 這個指標作為引數傳入函式時,包含了要監視是否可以寫入資料的檔案描述符,函式返回時將可以寫入的檔案描述符對應的bit保持置1,否則置0
fd_set * exceptfds
: 同上,用來監視檔案錯誤異常檔案
timeval * timeout
: 超時時間,如果達到此時間沒有監控到符合要求的檔案描述符,則會強制函式返回0
返回值
int
型別
如果監視到符合要求的檔案描述符,返回他們的總個數(>=1),如果沒有則返回0
如果發生錯誤返回-1(這個錯誤和第4個引數的錯誤不是同一概念)
如果是socket,則做好相應的socket初始化操作
對要監視的3種描述符的fd_set
進行初始化
呼叫select函式(如果3類監控條件中有無需監控的,可以直接傳入立即數0),例如:
retval =
select(2
,&readable_fds,0,
0,&timeout)
;
檢查返回值(=0?, >=1?, <0?),和對應的fd_set
,並進行相應操作
這個demo監視的是檔案描述符0和1,也就是標準輸入和標準輸出
#include
#include
#include
#include
#define buf_size 30
intmain
(int argc,
char
* ar**)
else
if(result ==0)
else
//寫入標準輸出if(
fd_isset(1
,&temps2))}
sleep(1
);}return0;
}
執行效果: 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 並且這些函式...