Linux企業級專案實踐之網路爬蟲(27)——多路IO複用

尹成發表於2014-09-04

 

與多執行緒和多程式相比,I/O多路複用的最大優勢是系統開銷小,系統不需要建立新的程式或者執行緒,也不必維護這些執行緒和程式。

主要應用:

(1)客戶程式需要同時處理互動式的輸入和伺服器之間的網路連線

(2)客戶端需要對多個網路連線作出反應

(3)TCP伺服器需要同時處理多個處於監聽狀態和多個連線狀態的套接字

(4)伺服器需要處理多個網路協議的套接字

(5)伺服器需要同時處理不同的網路服務和協議

 

 select()函式

#include <sys/time.h>
int select(int nfds, fd_set *readfds,fd_set *wtitefds, fd_set *errnofds,
struct timeval *timeout)

注意:描述符不受限與套接字,任何描述符都行

nfds:select()函式監視的描述符數的最大值,一般取監視的描述符數的最大值+1,

其上限設定在sys/types.h中有定義

#define FD_SETSIZE 256

readfds:select()函式監視的可讀描述符集合

wtitefds:select()函式監視的可寫描述符集合

errnofds:select()函式監視的異常描述符集合

timeout:select()函式監視超時結束時間,取NULL表示永久等待

timeout告知核心等待所指定描述字中的任何一個就緒可花多少時間。其timeval結構用於指定這段時間的秒數和微秒數。

 

        struct timeval{
                   long tv_sec;   //seconds
                   long tv_usec;  //microseconds
      };

這個引數有三種可能:

 

(1)永遠等待下去:僅在有一個描述字準備好I/O時才返回。為此,把該引數設定為空指標NULL。

 

(2)等待一段固定時間:在有一個描述字準備好I/O時返回,但是不超過由該引數所指向的timeval結構中指定的秒數和微秒數。

 

(3)根本不等待:檢查描述字後立即返回,這稱為輪詢。為此,該引數必須指向一個timeval結構,而且其中的定時器值必須為0。

 

返回值:返回總的位數這些位對應已準備好的描述符,否則返回-1

相關巨集操作:

      FD_ZERO(fd_set *fdset):清空fdset與所有描述符的關係
      FD_SET(int fd, d_set * fdset):建立描述符fd與fdset得關係
      FD_CLR(int fd, d_set * fdset):撤銷描述符fd與fdset得關係
      FD_ISSET(int fd, d_set * fdset):檢查與fdset聯絡的描述符fd是否可以讀寫,返回非零表示可以讀寫


 select()函式實現IO多路複用的步驟

(1)清空描述符集合

(2)建立需要監視的描述符與描述符集合的關係

(3)呼叫select函式

(4)檢查監視的描述符判斷是否已經準備好

(5)對已經準備好的描述符程式IO操作

 

相關文章