select 系統呼叫允許程式同時在多個底層檔案描述符上等待輸入的到達、輸出的完成,或產生錯誤資訊。這意味著終端**程式可以一直阻塞到有事情可做為止。
select 函式對資料結構 fd_set 進行操作,它是由開啟的檔案描述符構成的集合。有一組定義好的巨集可以用來控制這些集合:
#include
#include
void fd_zero(fd_set *fdset); //將 fd_set 初始化為空集合
void fd_set (int fd, fd_set *fdset); //在 fd_set 中設定 fd
void fd_clr (int fd, fd_set *fdset); //在 fd_set 中清除 fd
int fd_isset(int fd, fd_set *fdset); //判斷 fd 是否是 fd_set 集合中的乙個元素;若是,返回非零值。
當宣告了乙個檔案描述符集後,必須用fd_zero將所有位置零:
fd_set demo;
fd_zero(&demo);
select 系統呼叫原型:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);
引數 nfds 指定需要測試的檔案描述符數目,測試的描述符範圍從 0 到 nfds - 1 。
引數 timeout 用來防止無限期的阻塞,struct timeval 定義為:(time_t 在標頭檔案 sys/types.h 中定義,整數型別)
struct timeval;
timeout 有三種情況:
(1)timeout == null 等待無限長的時間。等待可以被乙個訊號中斷。當有乙個描述符做好準備或者是捕獲到乙個訊號時函式會返回。如果捕獲到乙個訊號, select函式將返回 -1,並將變數 erro 設為 eintr。
(2)timeout->tv_sec == 0 &&timeout->tv_usec == 0 不等待,直接返回。加入描述符集的描述符都會被測試,並且返回滿足要求的描述符的個數。這種方法通過輪詢,無阻塞地獲得了多個檔案描述符狀態。
(3)timeout->tv_sec !=0 ||timeout->tv_usec!= 0 等待指定的時間。當有描述符符合條件或者超過超時時間的話,函式返回。在超時時間即將用完但又沒有描述符符合條件的話,返回 0。對於第一種情況,等待也會被訊號所中斷。
函式返回:
(1)當監視的相應的檔案描述符集中滿足條件時,比如說讀檔案描述符集中有資料到來時,核心(i/o)根據狀態修改檔案描述符集,並返回乙個大於0的數。返回值為狀態發生變化的控制代碼個數。
(2)當沒有滿足條件的檔案描述符,且設定的timeval監控時間超時時,select函式會返回乙個為0的值。
(3)當select返回負值時,發生錯誤。
注:select可處理多個控制代碼狀態同時發生變化的情況。
linux select 系統呼叫
linux系統提供系統呼叫 select,它允許程式掛起,並等待從不止乙個檔案描述符的輸入。它的原理如下 獲得所需要的檔案描述符列表 將此描述符傳給 select select 掛起直到任何乙個檔案描述符有資料到達 select 設定乙個變數中的若干位,用來通知哪乙個檔案描述符已經有輸入的資料。se...
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是整數表示的...