I/O多路转接之 select
系統(tǒng)提供select函數(shù)來實(shí)現(xiàn)多路復(fù)用輸入/輸出模型。
作用:select系統(tǒng)調(diào)用是用來讓我們的程序監(jiān)視多個(gè)文件句柄的狀態(tài)變化的。程序會停在select這里等待,直到被監(jiān)視的文件句柄有一個(gè)或多個(gè)發(fā)生了狀態(tài)改變。
函數(shù)原型:
參數(shù)說明:
int nfds:需要監(jiān)視的最大文件描述符值+1;
fd_set *readfds & *writefds & *exceptfds:指向文件描述符的指針;這三個(gè)描述符集說明了我們關(guān)心的可讀、可寫或處于異常條件的各個(gè)描述符;
struct timeval *timeout:需要等待的時(shí)間,為NULL,則select一直阻塞,知道某個(gè)文件描述符發(fā)生了事件,為0,僅僅檢測描述集合的狀態(tài),立即返回,不等待外部事件的發(fā)生。
struct?timeval{long?tv_sec;????????/*?seconds?*/long?tv_usec;???????/*?microseconds?*/ };函數(shù)返回值:
成功:返回就緒描述符的個(gè)數(shù),0表示timeout結(jié)束,沒有描述符完成就緒;
失敗:-1,此時(shí)狀態(tài)描述參數(shù)和timeout都變成不可預(yù)測的,錯(cuò)誤信息存在errno中。
對fd_set數(shù)據(jù)類型可以進(jìn)行的處理是:
分配一個(gè)這種類型的變量;
將這種類型的一個(gè)變量值賦予同類型的另一個(gè)變量;或?qū)τ谶@種類型的變量使用下列四個(gè)函數(shù)中的一個(gè)。
void?FD_CLR(int?fd,?fd_set?*set);????//清除描述詞組set中相關(guān)的fd的位 int?FD_ISSET(int?fd,?fd_set?*set);???//測試描述詞組set中相關(guān)fd的位是否為真 void?FD_SET(int?fd,?fd_set?*set);????//設(shè)置描述詞組set中相關(guān)的fd位 void?FD_ZERO(fd_set?*set);???????????//清除描述詞組set的全部位select的缺點(diǎn):
(1)每次調(diào)用select,都需要把fd集合從用戶態(tài)拷貝到內(nèi)核態(tài),這個(gè)開銷在fd很多時(shí)會很大
(2)同時(shí)每次調(diào)用select都需要在內(nèi)核遍歷傳遞進(jìn)來的所有fd,這個(gè)開銷在fd很多時(shí)也很大
(3)select支持的文件描述符數(shù)量太小了,默認(rèn)是1024
select的優(yōu)點(diǎn):
(1)相較于之前多線程的方法,使用select不用創(chuàng)建線程,更方便
(2)select目前幾乎在所有的平臺上都支持,其良好跨平臺支持也是它的一個(gè)優(yōu)點(diǎn)?
轉(zhuǎn)載于:https://blog.51cto.com/10324228/1837181
總結(jié)
以上是生活随笔為你收集整理的I/O多路转接之 select的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MYSQL注入天书之order by后的
- 下一篇: Excel常用操作