|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux epoll事件触发
{+ r& o; N0 r% Y' A- h9 E( c# e( \6 U5 I5 o) Y
6 F; |1 Q1 G l) |! P一、什么是epoll
" N; O0 W2 V, Z( q0 V
) e5 ^) O' a9 }5 c, v
+ H% ]" t9 F8 E4 l epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linuxkernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。
! ?3 _' b2 [( S9 N) i3 G
: N0 F) R3 H/ y( h, m二、epoll的相关系统调用
. C; I: ` Q3 D& e2 ?7 F$ P8 ?. f0 A* ~) V
6 U9 F2 k) E6 K2 R8 W& U
epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用。 * A8 A% M: X H% |
9 d2 A- i9 x! ~7 n& p+ j
* X7 z z5 \# V# \1、int epoll_create(int size);
# G& Z! m. t4 h4 J* X3 u& `& `. w6 A! e4 l% C5 ^
$ [/ d, h; j P 创建一个epoll的句柄。自从linux2.6.8之后,size参数是被忽略的。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。
9 E2 N4 t4 K( W/ \6 l4 @
: x9 k6 i* P1 r1 o/ ?% I2. int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event);# r2 v! V0 c1 [/ }6 D& \
7 G2 ?, ^8 ^4 @, }* T& o, C+ D d. y
! l0 e5 Y" g7 `# { epoll的事件注册函数,它不同于select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。6 `4 o1 b3 X3 R# T$ V
8 f! l) d+ t1 a: `1 w5 R K a6 _- ^0 b- g: S9 @" s
% ^% R1 \: \5 |0 q4 A q) _
2 f8 B5 f' Q- o. ?$ U, b
4 b3 g9 L) O$ f
7 D8 {' l6 D, Q1 V0 w6 x- H3 w {+ ^
7 y! w6 Z! v$ |/ {; n! e2 r: g: h |
|