ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
本章节代码在:…\\tutorials\\Patchs\\2. epoll实例 ### 首先我们调用epoll\_create1创建一个实例: ``` int epoll_fd = epoll_create1(0); ``` ### 然后把要监听的文件描述符加入进去,调用epoll\_ctl 函数: 假设要监听的是fd:epoll\_ctl(epoll\_fd, EPOLL\_CTL\_ADD, fd, &ev); ### 参数说明: 1.第一个参数是epoll实例id; ### 2.第二个参数是选项,可选值: * EPOLL\_CTL\_ADD:注册新的fd到epfd中; * EPOLL\_CTL\_MOD:修改已经注册的fd的监听事件; * EPOLL\_CTL\_DEL:从epfd中删除一个fd; ### 3.第三个参数是要监听的文件描述符; ### 4.第四个参数类型(epoll\_event)如下: ``` 1.struct epoll_event   2.{   3.  uint32_t events;  /* Epoll events */   4.  epoll_data_t data;    /* User data variable */   5.};   6. 7.typedef union epoll_data   8.{   9.  void *ptr;   10.  int fd;   11.  uint32_t u32;   12.  uint64_t u64;   13.} epoll_data_t; ``` ### epoll\_data一般用来存储用户自己的数据,然后在监听到事件时可以取到这部分数据;epoll\_event中的events取值如下: * EPOLLIN : 对应的文件描述符可以读(包括对端SOCKET正常关闭); * EPOLLOUT: 对应的文件描述符可以写; * EPOLLPRI: 对应的文件描述符有紧急的数据可读; * EPOLLERR: 表示对应的文件描述符发生错误; * EPOLLHUP: 表示对应的文件描述符被挂断; * EPOLLET: 将 EPOLL设为边缘触发(Edge Triggered)模式(默认为水平触发); * EPOLLONESHOT: 只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里。 ### 直接上代码: ![](https://img.kancloud.cn/d6/18/d61865ac800156556a961bb932277996_718x922.png =600x) ### epoll\_ctl添加后,只需要不断调用epoll\_wait就可以完成描述符的监听了,有事件时,返回值会大于0。图中//TODO表示用户需要完成的业务代码,比如我们处理如下: ![](https://img.kancloud.cn/c1/15/c1154585c97c3d08f9fa99dbf8db20b3_832x810.png =600x) ### 这里只是实例代码,因此没有太多的容错处理(后面直接会提供一个商用的框架给大家参考),编译运行结果: ![](https://img.kancloud.cn/e6/c9/e6c9ba61918d4cbdff113eb5c6ff3ce1_370x248.png =300x)