建立epoll
int
epoll_create
(int size)
;int
epoll_create1
(int flags)
;返回值: 若成功返回乙個大於0的值,表示epoll例項;若返回-
1表示出錯
epoll_create建立乙個epoll例項,從linux2.6.8開始,引數size被自動忽略。但是該值仍然需要乙個大於零的整數。這個epoll例項用來呼叫epoll_ctl和epoll_wait。當這個epoll例項不再需要的時候則呼叫close方法關閉
(size一開始的作用時告訴linux核心檔案描述符字大小用來初始化linux核心資料結構)
epoll_create1的用法和epoll_create基本一致,如果epoll_create1的flags引數為0則用法和epoll_create一樣
修改描述符事件
int
epoll_ctl
(int epfd,
int op,
int fd,
struct epoll_event *event)
; 返回值: 若成功返回0;若返回-
1表示出錯
op:代表新增、刪除、修改描述符事件
typedef
union epoll_data epoll_data_t;
struct epoll_event
;
對應的events事件型別
epoll_wait:
int
epoll_wait
(int epfd,
struct epoll_event *events,
int maxevents,
int timeout)
; 返回值: 成功返回的是乙個大於0的數,表示事件的個數;返回0表示的是超時時間到;若出錯返回-
1.
epoll使用示例
#include
"lib/common.h"
#define maxevents 128
char
rot13_char
(char c)
intmain
(int argc,
char
**ar**)
event.data.fd = listen_fd;
event.events = epollin | epollet;if(
epoll_ctl
(efd, epoll_ctl_add, listen_fd,
&event)==-
1)/* buffer where events are returned */
events =
calloc
(maxevents,
sizeof
(event));
while(1
)else
if(listen_fd == events[i]
.data.fd)
else
}continue;}
else
break;}
else
if(n ==0)
elseif(
write
(socket_fd, buf, n)
<0)
}}}}
}free
(events)
;close
(listen_fd)
;}
edge-triggered vs level-triggered
條件觸發的意思是只要滿足事件的條件,比如有資料需要讀,就一直不斷地把這個事件傳遞給使用者;而邊緣觸發的意思是只有第一次滿足條件的時候才觸發,之後就不會再傳遞同樣的事件了。
python 網路程式設計 epoll的大坑
eopll 例項預設監聽 select.epollhup 一般只需要監聽select.epollin事件就行了 在另一方關閉連線時會傳送乙個空串,select.epollin 會捕捉這個空串事件,如果不對它處理的話這個事件會一直響應,需要手動關閉 connection.close 一般將所有連線的描...
linux網路程式設計之 epoll
include include include include include include include include include include using namespace std define maxline 5 define open max 100 define listen...
epoll監聽檔案 epoll的使用
epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為...