linux中i/o復用使得程式能夠同時監聽多個檔案描述符,這對提高程式的效能至關重要。
linux下實現i/o復用的系統呼叫主要有select、poll、epoll。
select系統呼叫
select的主要用途是:在一段時間內,監聽使用者感興趣的檔案描述符上的可讀,可寫和異常事件。
1.select原型
#include
intselect(int nfds,fd_set *readfd,fd_set *writefd,fd_set *exceptfds,struct timeval *timeout);
引數含義
(1)nfds:指定被監聽的檔案描述符的總數。通常需要加一,因為檔案描述符都從0開始。
(2)readfd,writefd,exceptfds分別指向可讀,可寫和異常事件對應的檔案描述符的集合。
我們通常使用以下的巨集來訪問fd_set結構體中的位:
fd_set結構體中共有1024個位,也就是說最多能容納1024個檔案描述符,1位表示乙個檔案描述符。
#include
fd_zeor(fd_set *fdset); //清楚集合中的所有位
fd_set(int fd,fd_set *fdset);//設定集合的位
fd_clr(int fd,fd_set *fdset);//清空集合所有位
fd_iseet(int fd,fd_set *fdset);//測試集合中的位里是否有資料
(3)timeout表示可超時的時間。不過我們不能完全相信select呼叫之後的返回值,比如timeout呼叫返回失敗後的值是不確定的。timeval結構體的定義如下:
struct timeval
;
如果給timeval的兩個成員變數都傳0,則select立即返回,如果給timeout傳遞null,則select會一直阻塞,直到有某個檔案描述符就緒。
3.函式返回值
(1)如果select成功時就返回檔案描述符的總數。
(2)如果在超時時間內沒有任何檔案描述符就緒,就返回0.
(3)失敗返回-1並設定error。
(4)如果在select等待期間,程式接受訊號,則邏輯返回-1,並設定eintr.
4.理解select模型
理解select模型的關鍵在於理解fd_set,為說明方便,取fd_set長度為1位元組,fd_set中的每一bit可以對應乙個檔案描述符fd。則1位元組長的fd_set最大可以對應8個fd。
(1)執行fd_set set; fd_zero(&set);則set用位表示是0000,0000。
(2)若fd=5,執行fd_set(fd,&set);後set變為0001,0000(第5位置為1)
(3)若再加入fd=2,fd=1,則set變為0001,0011
(4)執行select(6,&set,0,0,0)阻塞等待
(5)若fd=1,fd=2上都發生可讀事件,則select返回,此時set變為0000,0011。注意:沒有事件發生的fd=5被清空。
5.程式設計例項
使用select函式編寫乙個程式,5秒之內不在螢幕上輸入資料則列印出超時,否則列印出內容
#include
#include
#include
#include
#include
#include
int main()
; int n = select(fd+1,&fdset,null,null,&tv);
if(n == 0)
else
if(n == -1)
else
;read(fd,buff,127);
printf("read=%s\n",buff);}}
}}
結果: Linux I O多路復用(select)
i o多路復用是在多執行緒或多程序程式設計中常用技術。主要是通過select epoll poll三個函式支援的,就是通過記錄跟蹤每乙個sock i o流 的狀態來同時管理多個i o流,i o 多路復用技術通過把多個 i o 的阻塞復用到同乙個 select 的阻塞上,從而使得系統在單執行緒的情況下...
LinuxIO多路復用之select
listen 中backlog的值為兩個連線佇列的和 已完成連線佇列 和正處於三次握手的待連線佇列 ret listen sockfd,20 if 1 ret printf waiting for connnect n for i 0 imaxi if connfd maxfd 說明已經處理完客戶端...
Linux IO同步復用
關於同步與非同步 同步 呼叫者在執行乙個呼叫時,一直等待呼叫完成返回後才進行後續操作。非同步 呼叫者執行乙個呼叫時,立即返回,繼續進行後續操作而不關心呼叫是否完成。非同步與同步是對通訊機制的描述,而阻塞 非阻塞關心的是呼叫者的狀態 阻塞 當執行乙個呼叫時,呼叫者執行緒一直被掛起 cpu時間片切換給其...