|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux epoll事件触发4 a, t" M, w0 V. x. K* z
1 |) } M3 z$ H5 N1 ^1 ^; p
% v0 Q/ J3 Y) z1 M! [
一、什么是epoll& b2 K( X# h( ^0 M) p- M( W& `3 d9 C
; H: @7 l/ M ?' O5 Y6 j0 O, D2 a9 K
1 I# x' P# H8 o& v1 ^ a
epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linuxkernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。
9 h0 c# m5 s3 V7 Y4 J3 n
/ ]& q$ t0 e! e' {! O5 X! W二、epoll的相关系统调用
3 v0 X" I/ V4 I7 N6 x! X3 }- a7 O! Y4 j' ~ k
- Q K9 r3 }& V! }
epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用。 ( {9 o% G4 F4 l! p
" t% L: P% w) `, d2 d; ]
- P3 N6 E" e3 G1、int epoll_create(int size);
8 X! i4 j% @- |
' B4 P8 T, ?7 `+ h2 v) y# X; k7 p) [" V: A$ N$ G7 Q
创建一个epoll的句柄。自从linux2.6.8之后,size参数是被忽略的。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。
, d) v1 M7 Q& f2 W! h * f2 U' o- Y4 ~- g0 ]
2. int epoll_ctl(int epfd, int op,int fd, struct epoll_event *event);; I8 Q" s' K+ r/ n8 q+ C' J; i7 P
, e7 _) q* E) V# G+ F% ?+ T8 l
. X5 N8 k8 f8 w! ] epoll的事件注册函数,它不同于select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。+ w; a; y! K2 q, u4 C j, S# M
" I; A5 D8 j$ g
9 h+ {' N T: o) Y: t0 m) S
. g$ c& C# U4 i* r( ]9 ^8 _( a4 \7 K) M0 | ^3 G! w9 M8 R5 _
6 N9 w9 D- L, \: g- {- T; N
3 S! a( P h1 ^& p$ W6 w6 ^) @: b: a! P5 p$ J) U
+ i& a/ w* p5 |
|
|