epoll 學習筆記

2021-06-06 13:57:02 字數 2773 閱讀 4842

首先看一下epoll的幾個函式的介紹。

/** 

* * @param size size就是你在這個epoll fd上能關注的最大socketfd數

* * @return 生成的檔案描述符

*/int epoll_create(int size);

/* listener為socket檔案描述符,kdpfd為epoll檔案描述符 */

int listener, kdpfd;

struct sockaddr_in my_addr;

/* 建立socket */

if ((listener =socket(pf_inet, sock_stream, 0)) == -1)

bzero(&my_addr,sizeof(my_addr));

my_addr.sin_family = pf_inet;

my_addr.sin_port = htons(port);

my_addr.sin_addr.s_addr =inaddr_any;

/* 繫結socket */

if (bind(listener, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)

/*監聽socket */

if (listen(listener, lisnum)== -1)

/* 以上初始化完成後,建立epoll 控制代碼,

也可以先建立epoll控制代碼,再初始化socket */

kdpfd =epoll_create(maxepollsize);

/** 

* @brief 該函式用於控制某個epoll檔案描述符上的事件,可以註冊事件,修改事件,刪除事件。

* * @param epfd 由 epoll_create 生成的epoll專用的檔案描述符

* @param op 要進行的操作例如註冊事件,可能的取值epoll_ctl_add 註冊、epoll_ctl_mod 修 改、epoll_ctl_del 刪除

* @param fd 關聯的檔案描述符

* @param event 指向epoll_event的指標

* * @return 0 succ

* -1 fail

*/int epoll_ctl(int epfd,int op,int fd,structepoll_event*event);

其中用到的資料結構結構如下:

typedef union epoll_data  epoll_data_t; 

struct epoll_event ;

常用的事件型別:

epollin :表示對應的檔案描述符可以讀;

epollout:表示對應的檔案描述符可以寫;

epollpri:表示對應的檔案描述符有緊急的資料可讀

epollerr:表示對應的檔案描述符發生錯誤;

epollhup:表示對應的檔案描述符被結束通話;

epollet: 表示對應的檔案描述符有事件發生;

struct epoll_event ev;

//設定要處理的事件型別

ev.events =epollin | epollet;

//設定與要處理的事件相關的檔案描述符

ev.data.fd =listener;

//註冊epoll事件,將監聽的socket加入epoll

if (epoll_ctl(kdpfd,epoll_ctl_add, listener, &ev) < 0)

/** 

* @brief 該函式用於輪詢i/o事件的發生

* * @param epfd 由epoll_create 生成的epoll專用的檔案描述符

* @param events 用於回傳代處理事件的陣列

* @param maxevents 每次能處理的事件數

* @param timeout 等待i/o事件發生的超時值;-1相當於阻塞,0相當於非阻塞。一般用-1即可

* * @return >=0 返回發生事件數

* -1 錯誤

*/int epoll_wait(int epfd,structepoll_event* events,int maxevents,int timeout);

struct epoll_event events[maxepollsize];

while (1)

/* 處理所有事件 */

for (n = 0; n else

setnonblocking(new_fd);

ev.events = epollin | epollet;

ev.data.fd = new_fd;

if (epoll_ctl(kdpfd,epoll_ctl_add, new_fd, &ev) < 0)

curfds++;

}else}}

}close(listener);

epoll 學習筆記

epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...

epoll學習筆記

epoll學習筆記 epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的select poll操作,只要還有沒有處理的事件就會一直通知.以...

epoll學習筆記

epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...