I o復用簡單的介紹

2021-10-07 10:45:21 字數 1898 閱讀 9355

1.i/o復用使得程式能同時監聽多個檔案描述符,這對提高程式效能相關重要。通常一下,情況,網路程式在下列情況需使用i/o復用技術。

a.客戶端程式要同時處理多個socket.

b.客戶端程式要同時處理使用者輸人和網路連線。

c.tcp伺服器要同時處理監聽socket和連線socket.這是i/o復用使用最多的場合。

d.伺服器要同時處理tcp請求和udp請求。

e.伺服器要同時監聽多個埠,或者處理多種服務。

注意:io復用雖然能同時監聽多個檔案描述符,但它本身是阻塞的。當

多個檔案描述符同時就緒時,如果不採取額外的措施,程式就只能按順序依次處理其中的每乙個檔案描述符,這使得伺服器程式看起來像是序列工作的。如果要實現併發,只能使用多程序或多執行緒等程式設計手段。

select系統呼叫的用途是:在一 段指定時間內,監聽使用者感興趣的檔案描述符上的可讀、可寫和異常等事件。

select系統呼叫的原型如下:

#include

int select( int nfds, fd_ set* readfds, fd_ set* writefds, fd_ set* exceptfds,

struct timeval* t imeout ) ;

1) nfds引數指定被監聽的檔案描述符的總數。(檔案描述符是0開始,最大是1)

2) readfds、writefds 和exceptfds引數分別指向可讀、可寫和異常等事件對應的檔案描述符集合。

3).fd. set結構體僅包含乙個整型陣列,該陣列的每個元素的每一位(bit)標記乙個檔案描述符。fd. set 能容納的檔案描述符數量由fd_ setsize指定,這就限制了select能同時處理的檔案描述符的總量。

我們用巨集來訪問fd. set 結構體中的位:

#include

fd zero( fd_ set *fdset );/、清除fdset的所有位

fd_ set( int fd, fd_ set *fdset );//設定fdset的位fd

fd_ clr( int fd, fd_ set fdset );//清除fdset的位fd

int ed_ isset( int fd, fd_ set fdset ); / 測試fdset的位td是否被設定/

3) timeout 引數用來設定selct函式的超時時間。它是乙個timeval結構型別的指標.我們不能完全信任sclect呼叫返回後的timeout值,比如呼叫失敗時timeout值是不確定的。timeval 結構體的定義如下:

struct timeva1

;檔案描述符就緒條件

1.在網路程式設計中,下列情況下socket可讀:

a. socket核心接收快取區中的位元組數大於或等於其低水位標記so_ rcvlowat.此時我們可以無阻塞地讀該socket,並且讀操作返回的位元組數大於0.

b. socket通訊的對方關閉連線。此時對該socket的讀操作將返回0.

c.監聽socket.上有新的連線請求。

d.socket上有未處理的錯誤。此時我們可以使用getsockopt來讀取和清除該錯誤。

2.下列情況下socket可寫:

a.socket核心傳送快取區中的可用位元組數大於或等於其低水位標記so _sndlowat.此時我們可以無阻塞地寫該socket,並且寫操作返回的位元組數大於0。

b.socket的寫操作被關閉。對寫操作被關閉的socket執行寫操作將觸發- -個 sigpipe訊號。

c. socket使用非阻塞connect連線成功或者失敗(超時)之後。

d.socket上有未處理的錯誤。此時我們可以使用getsockopt來讀取和清除該錯誤。

3.網路程式中,select 能處理的異常情況只有- -種: socket. 上接收到帶外資料。

list item

IO復用之poll函式介紹

函式原型 include intpoll struct pollfd fds,nfds t nfds,int timeout 函式功能 等待乙個檔案描述符轉變為就緒狀態 引數1 第乙個引數是指向乙個結構陣列第乙個元素的指標。每個陣列元素都是乙個pollfd結構,用於指定測試某個給定描述符fd的條件。...

高併發多路I O復用的select介紹

select 1 基本概念 io多路復用是指核心一旦發現程序指定的乙個或者多個io條件準備讀取,它就通知該程序。io多路復用適用如下場合 1 當客戶處理多個描述字時 一般是互動式輸入和網路套介面 必須使用i o復用。2 當乙個客戶同時處理多個套介面時,而這種情況是可能的,但很少出現。3 如果乙個tc...

I O復用select函式的簡單用法

1 select函式 include intselect int maxfd fd set readset,fd set writeset,fd set exceptset const struct timeval timeout 說明 作用 將多個檔案描述符集中到一起監視。2 使用 fd set型...