Linux select函式的使用

2021-10-12 17:31:26 字數 2315 閱讀 5973

2023年12月23日 by: bob

2. 函式原型和引數說明

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