Linux企業級專案實踐之網路爬蟲(27)——多路IO複用
與多執行緒和多程式相比,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操作
相關文章
- Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(4)——主程式流程Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(8)——認識URLLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(18)——佇列處理Linux爬蟲佇列
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式Linux爬蟲套件模式
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- 網路爬蟲專案爬蟲
- golang中基於kevent的IO多路複用實踐Golang
- 企業資料爬蟲專案爬蟲
- 理解IO多路複用
- 網路爬蟲專案蒐集爬蟲
- 企業資料爬蟲專案(二)爬蟲
- IO多路複用詳解
- Redis 和 IO 多路複用Redis
- IO多路複用原理剖析
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 專案--python網路爬蟲Python爬蟲
- 網路爬蟲(python專案)爬蟲Python