|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux epoll事件触发/ }( Q3 [) h9 `) [* N7 [
* }+ J8 ]0 _/ s' m Y/ E
. d/ A$ \2 U3 n; F t
一、什么是epoll5 w1 ], a, ?- y5 |% ?- ~1 A
8 l5 x1 U9 `, D. s" @& C o& V5 q& x" t/ K. U
epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linuxkernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。* t6 ^8 x0 O/ l4 @+ j+ T/ U' P/ [- Z8 m
- ^5 E4 G0 ^' F. ]$ n2 |" h二、epoll的相关系统调用
4 Z2 h9 z. t4 Q. l2 M% L) Q" G2 g
, O d, b; u' o$ j3 L
# b" h3 r+ R6 e" V3 E' l9 j epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用。 # U, G B, z% \& C
9 a2 \" k0 ~& d; P" Z% T4 P, w' C
9 O, N( Q0 a. W& G; ^! z* K1、int epoll_create(int size);9 g2 _7 z! p# u6 o z. I
; T4 m3 y8 A& Y5 [
6 @* `6 P6 R7 X, o9 F 创建一个epoll的句柄。自从linux2.6.8之后,size参数是被忽略的。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。
! h+ d0 y- N d, p- x5 j* D! u
2 D N; k7 x# b' T* ~2 j" p2. int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event);
B, ~5 z4 \' W5 r6 K. Z) ?/ _$ s& v o8 J1 l3 J1 `
/ n9 b) C# m6 H) h5 Z$ |% @ epoll的事件注册函数,它不同于select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。
1 q6 S: T( ]6 u& L! h; G8 b4 l/ [
. G& h% i0 U: Y. p; X4 K9 D) Y& g. Y& Y
. p* Q/ C$ O' c
. h) t) ]/ ^# Y$ ^5 F
% _: L0 e0 ~( y/ ^
9 h( M9 L1 `0 B1 O& k& F5 x- F4 Z
1 r/ e1 j0 V( n1 T0 r: s( n* T9 q) `0 ?5 x- t$ D9 L0 y
|
|