不負責任地放上中文版epoll維基,科學上網。
原理什麼的不多講,我也不是很熟,這裡就簡單寫一些實際應用要怎麼寫,當然也是很簡單的demo。
typedef
union epoll_data epoll_data_t;
struct epoll_event ;
int epoll_create(int size);
// 這個函式用來建立epoll
// 引數size是指這個epoll最多能同時監聽多少個檔案描述符的事件
// 函式返回值是epoll的檔案描述符,linux下面檔案描述符簡直無處不在
int efd = epoll_create(10);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
// 這個函式用來管理事件的監聽
// 引數epfd就是用epoll_create函式獲得的檔案描述符
// 引數op是乙個用位數來表示配置的變數,表示當前操作是增加事件還是刪除事件
// 引數event儲存的是具體的事件配置
int fd = socket(fa_inet, stream, 0);
...struct epoll_event event;
event.data.fd = fd;
event.events = epollin | epollrdhup;
epoll_ctl(efd, epoll_ctl_add, fd, &event);
struct epoll_event 事件及結構體的書寫
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
// 這個函式用來獲取當前的事件處於待處理狀態的檔案描述符
// epfd是epoll描述符
// events是事件列表,用來獲取待處理的事件,
// maxevents表示最多能取多少個struct epoll_event
// timeout表示超時時間,如果一直沒有事件響應,那麼到了超時時間,函式會阻塞狀態返回回來,-1表示沒有超時時間,一直阻塞等待事件的到達
struct epoll_event events[10];
int ret = epoll_wait(efd, events, 10, -1);
for (int i = 0; i < ret; i++) ;
int res = read(events[i].data.fd, buf, sizeof buf);
if (res == 0) else
}
#include
#include
#include
#include
#include
#include // 個人封裝的網路庫,相當簡單,未來會完善(說出來我自己都不信)
using
namespace
std;
int main() else ;
int ret = fdclient[events[i].data.fd].read(buf, 100);
if (ret == 0)
} else
if (ret == -1) else }}
}server.close(); // 關閉本地套接字
close(efd); // 關閉epoll檔案描述符
return
0;}
上面**中用到的網路套接字封裝我放在github中了 : crazy_net Linux IO多路復用
一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
Linux C Socket多路復用
1.迴圈伺服器 udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現.socket bind while 1 因為udp是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...