epoll_ctl函数的使用

#include <sys/epoll.h>

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
作用:
这个系统调用用于操作epoll函数所生成的实例(该实例由epfd指向),向fd实施op操作。
参数一:epfd
由epoll调用产生的文件描述符
参数二:op
操作的类型,具体包含
       EPOLL_CTL_ADD
              Register the target file descriptor fd on the epoll instance
              referred to by the file descriptor epfd and associate the
              event event with the internal file linked to fd.

       EPOLL_CTL_MOD
              Change the event event associated with the target file
              descriptor fd.

       EPOLL_CTL_DEL
              Remove (deregister) the target file descriptor fd from the
              epoll instance referred to by epfd.  The event is ignored and
              can be NULL (but see BUGS below).
参数三:fd
op实施的对象
参数四:event
struct epoll_event {
    __uint32_t events; /* Epoll events */
    epoll_data_t data; /* User data variable */
};

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

data成员变量:
是一个union类型的变量,类型定义如下
typedef union epoll_data {
    void *ptr;
    int fd;
    __uint32_t u32;
    __uint64_t u64;
} epoll_data_t;

 

 

 

参考资料

http://www.man7.org/linux/man-pages/man7/epoll.7.html

转载于:https://www.cnblogs.com/Dream-Chaser/p/7401184.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
epoll_ctl函数是用来向epoll实例中添加、修改或删除文件描述符的,其函数原型如下: ```c int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); ``` 其中,epfd是epoll实例的文件描述符,op指定操作类型,可以是EPOLL_CTL_ADD、EPOLL_CTL_MOD或EPOLL_CTL_DEL,fd是需要添加、修改或删除的文件描述符,event是一个epoll_event结构体,用来描述需要监听的事件类型和其他信息。 EPOLL_CTL_ADD操作用于向epoll实例中添加新的文件描述符,如果fd已经存在于epoll实例中,则会返回错误。event结构体中需要填写的字段包括: - events:需要监听的事件类型,可以是EPOLLIN、EPOLLOUT、EPOLLRDHUP、EPOLLPRI或EPOLLERR等。 - data:用户自定义数据,可以是任意类型的指针。 EPOLL_CTL_MOD操作用于修改已经存在于epoll实例中的文件描述符的监听事件类型和用户自定义数据。event结构体中需要填写的字段同EPOLL_CTL_ADD操作。 EPOLL_CTL_DEL操作用于从epoll实例中删除文件描述符,event可以为NULL。 需要注意的是,在使用epoll_ctl函数添加或修改文件描述符时,需要将文件描述符设置为非阻塞模式,否则可能会出现阻塞的情况。 下面是一个使用epoll_ctl函数添加文件描述符的例子: ```c int epoll_fd = epoll_create(10); // 创建epoll实例 struct epoll_event ev; ev.events = EPOLLIN | EPOLLET; // 监听读事件,使用ET模式 ev.data.fd = fd; // 需要监听的文件描述符 if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) { perror("epoll_ctl"); exit(EXIT_FAILURE); } ``` 这段代码将fd添加到epoll实例中,并监听其读事件,使用ET模式。如果添加失败,则输出错误信息并退出程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值