|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux epoll事件触发1 `+ z* z6 k$ L8 W) }% m. k
; u) b# T; _4 ]5 U. l+ }9 j5 S, f+ ^7 v$ B; i: c. R/ u! b
一、什么是epoll
3 b$ O, F0 \# N* Q
) r; z2 ~: c5 y. Y* k o# w! ]" Q2 w R. a2 O/ l& O2 l9 T. 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就绪通知方法。
1 x x3 g" e4 Z9 w" o$ g3 Y* X- r3 q & }6 G' b5 Y2 e
二、epoll的相关系统调用
' \- I9 Z5 t+ a S4 V# J8 d& |1 l+ K% X3 t; f6 F
) h4 ~/ Z5 ]# T8 c% v4 |
epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用。 1 O) h5 Q) w" o
# ^- \& @4 l7 Q6 [5 h1 \, c9 }* r- X8 m1 k5 h5 f
1、int epoll_create(int size);6 x9 a4 i& \! e) N) w) I
% _- A- q$ ~$ Z# d( G' k$ C+ H" u- |! W1 n3 @ O: a: j7 r
创建一个epoll的句柄。自从linux2.6.8之后,size参数是被忽略的。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。- v" R; Q: m5 H* N- h7 v- l/ t. S
4 u. t* E- N1 }# A, `0 B: t
2. int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event);
" f7 {$ _8 Z5 R. G% r" ]( C5 f3 Y0 \# L d5 x4 A8 ~/ }
$ n* O) K$ U4 F! j0 M4 W6 @" n2 u# F
epoll的事件注册函数,它不同于select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。
, v K" v& V) t/ [# k0 y
0 a2 M: w# z& R
2 o! X- C+ h* _- T# }3 L ?+ d8 s5 q' Z. Q
. w/ B s$ v! F7 y
# H! o9 l8 U+ J
$ v' y/ ~6 [' ? ^& T2 R) t- T; D/ q5 I2 [+ X2 K$ X! i+ [7 L- y
, P: J/ e+ M' ?# ?& v |
|