Linux I O復用 select系統呼叫

2021-07-31 17:11:48 字數 2039 閱讀 6233

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時間片切換給其...