epoll使用方法
epoll 使用方法 epoll 是 Linux 操作系统中的一个多路复用 I/O 机制,能够同时监控多个文件描述符的变化,高效地处理网络请求。下面详细介绍 epoll 的使用方法。 epoll 的工作模式 epoll 有两种工作方式:LT (Level Triggered) 和 ET (Edge Triggered)。LT 模式是缺省的工作方式,同时支持 block 和 no-block socket。在 LT 模式下,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的 fd 进行 I/O 操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的 select/poll 都是这种模型的代表。 ET 模式是高速工作方式,只支持 no-block socket。在 ET 模式下,当描述符从未就绪变为就绪时,内核就通过 epoll 告诉你,然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作而导致那个文件描述符不再是就绪状态。例如,你在发送、接收或是接受请求,或者发送接收的数据少于一定量时导致了一个 EWOULDBLOCK 错误。 epoll_create() 的使用方法 epoll_create() 函数用于创建一个 epoll 句柄,size 用来告诉内核需要监听的数目一共有多大。当创建好 epoll 句柄后,它就是会占用一个 fd 值,在 Linux 下如果查看 /proc/进程 id/fd/,是能够看到这个 fd 的,所以在使用完 epoll 后,必须调用 close() 关闭,否则可能导致 fd 被耗尽。 epoll_ctl() 的使用方法 epoll_ctl() 函数是 epoll 的事件注册函数,第一个参数是 epoll_create() 的返回值,第二个参数表示动作,使用如下三个宏来表示: * EPOLL_CTL_ADD //注册新的 fd 到 epfd 中; * EPOLL_CTL_MOD //修改已经注册的 fd 的监听事件; * EPOLL_CTL_DEL //从 epfd 中删除一个 fd; 第三个参数是需要监听的 fd,第四个参数是告诉内核需要监听什么事,struct epoll_event 结构如下: typedef union epoll_data{ void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t; struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ |EPOLLET; } events 可以是以下几个宏的集合: * EPOLLIN //表示对应的文件描述符可以读(包括对端 SOCKET 正常关闭); * EPOLLOUT //表示对应的文件描述符可以写; * EPOLLPRI //表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来); * EPOLLERR //表示对应的文件描述符发生错误; * EPOLLHUP //表示对应的文件描述符被挂断; * EPOLLET //将 EPOLL 设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。 epoll_wait() 的使用方法 epoll_wait() 函数用于等待 epoll 句柄的事件触发。它的第一个参数是 epoll_create() 的返回值,第二个参数是需要等待的事件,第三个参数是超时时间。 在服务器端,epoll 可以用来监控多个文件描述符的变化,高效地处理网络请求。在客户端,epoll 可以用来监控 socket 的变化,实时地检测到服务器的响应。 epoll 是Linux 操作系统中的一个多路复用 I/O 机制,能够同时监控多个文件描述符的变化,高效地处理网络请求。