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