epoll模型 - epoll_ctl

优质
小牛编辑
130浏览
2023-12-01

函数原型

  1. #include <sys/epoll.h>
  2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

参数

epfd

是[[epoll_create|epoll_create]]的返回值。

op

表示动作,它由三个宏来表示

  • EPOLL_CTL_ADD:注册新的fd到epfd中;
  • EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
  • EPOLL_CTL_DEL:从epfd中删除一个fd;

fd

要监听的文件描述符

event

可以是以下几个宏逻辑或的组合

描述

EPOLLIN |表示对应的文件描述符可以读(包括对端SOCKET正常关闭)
EPOLLOUT|表示对应的文件描述符可以写
EPOLLPRI|表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来)
EPOLLERR|表示对应的文件描述符发生错误
EPOLLHUP|表示对应的文件描述符被挂断
EPOLLET| 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的
EPOLLONESHOT|只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

检测event(struct epoll_event类型)是否包含某一标识

  1. if(event & EPOLLHUP){
  2. ...
  3. }
  4. if(event & (EPOLLPRI|EPOLLERR|EPOLLHUP)){
  5. ...
  6. }