select用於實現I O多路復用

2021-06-07 23:57:29 字數 2010 閱讀 6139

阻塞和非阻塞

阻塞函式在完成其指定的任務以前不允許程式呼叫另乙個函式。例如,程式執行乙個讀資料的函式呼叫時,在此函式完成讀 操作以前將不會執行下一程式語句。當伺服器執行到accept語句時,而沒有客戶連線服務請求到來,伺服器就會停止在accept語句上等待連線服務請求 的到來。這種情況稱為阻塞(blocking)。而非阻塞操作則可以立即完成。比如,如果你希望伺服器僅僅注意檢查是否有客戶在等待連線,有就接受連線, 否則就繼續做其他事情,則可以通過將socket設定為非阻塞方式來實現。非阻塞socket在沒有客戶在等待時就使accept呼叫立即返回。

#include

#include

……

sockfd = socket(af_inet,sock_stream,0);

fcntl(sockfd,f_setfl,o_nonblock);

…… 通 過設定socket為非阻塞方式,可以實現"輪詢"若干socket。當企圖從乙個沒有資料等待處理的非阻塞socket讀入資料時,函式將立即返回,返 回值為-1,並置errno值為ewouldblock。但是這種"輪詢"會使cpu處於忙等待方式,從而降低效能,浪費系統資源。而呼叫select()會有效地解決這個問題,它允許你把程序本身掛起來,而同時使系統核心監聽所要求的一組檔案描述符的任何活動,只要確認在任何被監控的檔案 描述符上出現活動,select()呼叫將返回指示該檔案描述符已準備好的資訊,從而實現了為程序選出隨機的變化,而不必由程序本身對輸入進行測試而浪費cpu開銷。

select用於實現i/o多路復用,防止函式沒有得到資源而阻塞,長期占用cpu.

#include

#include

#include

int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);

select()用來等待檔案描述詞狀態的改變。引數n代表最大的檔案描述詞加1,引數readfds、writefds 和exceptfds 稱為

描述片語,是用來回傳該描述詞的讀,寫或例外的狀況。底下的巨集提供了處理這三種描述片語的方式:

fd_clr(inr fd,fd_set* set);用來清除描述片語set中相關fd 的位

fd_isset(int fd,fd_set *set);用來測試描述片語set中相關fd 的位是否為真

fd_set(int fd,fd_set*set);用來設定描述片語set中相關fd的位

fd_zero(fd_set *set); 用來清除描述片語set的全部位

引數  timeout為結構timeval,用來設定select()的等待時間,其結構定義如下

struct timeval ;

返回值  如果引數timeout設為null則表示select()沒有timeout。

執行成功則返回檔案描述詞狀態已改變的個數,如果返回0代表在描述詞狀態改變前已超過timeout時間,當有錯誤發生時

則返回-1,錯誤原因存於errno,此時引數readfds,writefds,exceptfds和timeout的值變成不可**。

ebadf 檔案描述詞為無效的或該檔案已關閉

eintr 此呼叫被訊號所中斷

einval 引數n 為負值。

enomem 核心記憶體不足

範例  常見的程式片段:fs_set readset;

fd_zero(&readset);

fd_set(fd,&readset);

select(fd+1,&readset,null,null,null);

if(fd_isset(fd,readset)

例:#include

#include

#include

#include

#include

int main ()

}//time out when ret = 0

else if (ret == 0)

printf("time out/n"); }

}

I O多路轉接(select

一.基本概念 二.函式原型 includeint select int nfds,fd set readfds,fd set writefds,fd set exceptions,struct timeval timeout fd set 介面 void fd clr int fd,fd set s...

select多路IO轉接

void fd zero fd set set 清空乙個檔案描述符集合。fd set rset fd zero rset void fd set int fd,fd set set 將待監聽的檔案描述符,新增到監聽集合中 fd set 3,rset fd set 5,rset fd set 6,rs...

IO 多路轉接 select

select多路io轉接 原理 借助核心,select來監聽,客戶端連線 資料通訊事件 void fd clr int fd,fd set set 將乙個檔案描述符從監聽集合中 移除 fd clr 4,rset int fd isset int fd,fd set set 判斷乙個檔案描述符是否在監...