多路io復用: 就是實現同時監控多個檔案描述符(此類檔案描述符必須為不可操作時會進入堵塞狀態), 會堵塞直到有乙個或多個檔案描述符可操作為止, 通過返回值找出可操作的檔案描術符(可代替多執行緒工作).
linux下共有三個函式可完成此工作:
一. poll函式
#include
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
每個要被監控的檔案描術符需要乙個struct pollfd結構體變數來描述
struct pollfd ;
/////////
/// fds是struct pollfd結構體的變數陣列
nfds是表示struct pollfd陣列的元素個數
timeout表示poll函式的最大的堵塞時間, 如超時則不管有沒有檔案描述符可操作都會返回.
負數表示堵塞沒有時間限制.
////
此函式返回值為多少個結構體變數的revents成員有值的個數. 0表示超時. -1表示出錯
////沒有辦法通過函式返回值判斷哪個檔案描述符可操作.只能通過結構體變數的revents成員
//也就是只能遍歷整個struct pollfd陣列裡元素的revents成員來找出
二. select函式
#include
intselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
readfds, writefds, exceptfds是三個檔案描述符的集合, 分別裝載要監控可讀操作的檔案描述符, 裝監控可寫的檔案描述符, 裝監控發生異常的檔案描述符
nfds是三個檔案描述符裡最大的檔案描述符數 + 1;
timeout指select函式的最大超時上限. 為null表示沒有上限時間
函式返回值為多少個檔案描述符可操作. 為0表示超時, -1出錯
//關於檔案描述符fd_set的操作
void fd_clr(int fd, fd_set *set); //從集合set裡清除fd
int fd_isset(int fd, fd_set *set);//判斷fd是否在集合set裡
void fd_set(int fd, fd_set *set); //把fd加入集合set裡
void fd_zero(fd_set *set); //把集合set清空
//怎樣判斷哪些檔案描述符可操作,沒法通過函式返回值判斷
//函式返回後,在集合裡只會留下可操作的檔案描述符, 只能在集合裡通歷遍判斷找出具體哪些檔案描述符可操作
三. epoll函式
#include
1. 先建立epoll的例項
int epoll_create(int size); //size為指定能監控的檔案描述符數上限
int epoll_create1(int flags); //不用指定上限, flags設0即可
返回值為乙個檔案描述符,此檔案描述符是引用epoll例項的, 也就是通過此檔案描述符可操作建立出來的epoll例項
2. 通過epoll_ctl函式把要監控的檔案描述符加入epoll例項裡, 也可以通過epoll_ctl函式從epoll例項裡稱除檔案描述符.
int epoll_ctl(int epfd, int op, int fd, struct
epoll_event *event);
// epfd為引用epoll例項的檔案描述符
// op為具體操作:
epoll_ctl_add:把fd加入epoll例項
epoll_ctl_del:把fd從epoll例項移除掉
//每加入乙個檔案描述符到epoll例項裡,都需要呼叫此函式一次.
typedef
union epoll_data epoll_data_t;
struct epoll_event ;
struct myevent ;
struct myevent myevt;
epoll_ctl(...., &myevt.evt)
3. 通過epoll_wait函式等待返回可操作的檔案描述符
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
//epfd表示引用epoll例項的檔案描述符
//evetns表示接收到可操作檔案描述符對應的epoll_event變數, 如要能接收多個可操作檔案描述符,則evetns應是epoll_event的陣列首位址.
// maxevents為events對應的陣列元素個數
// timeout為超時時間, -1表示沒時間限制
函式返回值, 為0表示超時.成功返回可讀檔案描述符個數,而且此檔案描述符的epoll_event資料已存放在events引數裡
嵌入式Linux的POLL SELECT 方式
版本 日期作者 說明v1 2020 韋東山摘自 嵌入式linux應用開發完全手冊 簡單地說,它們就是 定個鬧鐘 在呼叫 poll select 函式時可以傳入 超時時間 在這段時間內,條件合適時 比如有資料可讀 有空間可寫 就會立刻返回,否則等到 超時時間 結束時返回錯誤。用法如下。事件型別 說明p...
epoll程式設計例項客戶端 網路程式設計 epoll
前言 前面講了io多路復用的api,select和poll的缺點是效能不夠,客戶端連線越多效能下降越明顯,epoll的出現解決了這個問題,引用the linux programming inte ce的乙個統計對比如下 fd數量 poll cpu時間 秒 select cpu時間 秒 epoll c...
web伺服器 併發web伺服器實現 epoll
在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。epoll 是當今 linux 系統採用的方式,一般伺服器都是用 epoll 來實現的。epoll 是一種方案,這種方案不使用多程序多執行緒多協程,而是使用單程序單...