epoll
is used to: monitoring multiple file descriptors to see if I/O is possible on any of them. Can be used either as edge-triggered
or level-triggered
mode. 下面是epoll的常用接口:
* epoll_create
: creates a new epoll instance and returns a file descriptor referring to that instance.
* epoll_ctrl
: register/deregister the file descriptors.
* epoll_wait
: waits for I/O events, blocking the calling thread if no events are currently available.
Level-triggered(LT) and edge-triggered(ET)
假如有如下的操作:
1. The file descriptor that represents the read side of the pipe(rfd) is registered on the epoll
instance.
2. A pipe writer writes 2 kb of data on the write side of the pipe.
3. A call to epoll_wait
is done that will return rfd as a read file descriptor.
4. The pipe reader reads 1 kB of data from rfd.
5. a call to epoll_wait
is done.
Edge-triggered mode delivers events only when changes occur on the monitored file descriptor. 如上的例子,虽然在step4读取了1kb之后,buffer中还有1kb数据未读,但是在step5 might 可能不会再去读,因为在monitored filed descriptor没有change. The suggested way to use epoll as ET is as follows:
* with nonblocking file descriptor.
* by waiting for an event only after read or write return EAGAIN.