epoll实现机制分析:
epoll是Linux特有的I/O复用函数。它在实现和使用上与select和poll有很大的差异。首先,epoll使用一组函数来完成任务,而不是单个的函数。其次,epoll把用户关心的文件描述符上的事件放在内核的一个时间表中,从而无需像select和epoll那样每次调用都要重复传入文件描述符和集或事件集。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表。而这个文件描述符使用epoll_create函数来创建。
size参数现在并不起作用,只是给内核一个提示。告诉它时间表需要多大。该函数返回的文件描述符将用作其他所有epoll系统调用的第一个参数,以指定要访问的内核事件表。
实质:epoll_create函数的返回值为epfd,每个epfd在内核中有一个对应的eventpoll结构体对象。其中关键的成员是一个就绪队列和一颗红黑树。一个fd被添加到epoll中之后,系统就会为它生成一个对应的epitem结构对象。epitem被添加到eventpoll的红黑树中。红黑树的作用是使用者调用EPOLL_CTL_MOD、EPOLL_CTL_ADD或EPOLL_CTL_DEL的时候可以迅速找到对应的就绪事件。
epoll_ctl:
epfd参数是要操作的文件描述符,op参数则指定操作类型。event参数指定事件,它是epoll_event结构体指针类型。epoll_event的定义如下: