Linux的epoll用法与数据结构dataevent

Posted 苍山有雪,剑有霜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的epoll用法与数据结构dataevent相关的知识,希望对你有一定的参考价值。

epoll_create:创建一个指示epoll内核事件表的文件描述符,返回一个epfd。

//该描述符将用作其他epoll系统调用的第一个参数,其实size不起作用。
int epoll_create(int size)

epoll_ctl:操作内核事件表监控的文件描述符上的事件:注册、修改、删除

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

其中,各个参数如下。

epfd:为epoll_creat的句柄

op:表示动作,用3个宏来表示:

  • EPOLL_CTL_ADD (注册新的fd到epfd),

  • EPOLL_CTL_MOD (修改已经注册的fd的监听事件),

  • EPOLL_CTL_DEL (从epfd删除一个fd);

event:告诉内核需要监听的事件,event结构体定义如下

//联合体:多种类型是为了考虑后期的拓展
typedef union epoll_data {
    void *ptr;
    int fd;//存放文件描述符
    __uint32_t u32;
    __uint64_t u64;
} epoll_data_t;

//epoll事件
struct epoll_event {
    __uint32_t events; /* Epoll events */
    epoll_data_t data; /* User data variable */
};

其中,这个void* ptr指针其实主要是为了自定义的数据结构,用处很大,但一般用不到
events描述事件类型,其中**epoll事件类型有以下几种,**他们之间可以使用|或&进行连接:

  • EPOLLIN:表示对应的文件描述符可以读(包括对端SOCKET正常关闭)

  • EPOLLOUT:表示对应的文件描述符可以写

  • EPOLLPRI:表示对应的文件描述符有紧急的数据可读

  • EPOLLERR:表示对应的文件描述符发生错误

  • EPOLLHUP:表示对应的文件描述符被挂断

  • EPOLLET:将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)而言的(默认是LT模式,不用写明

  • EPOLLONESHOT:只监听一次该事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

  • EPOLLRDHUP:表示读关闭,对端关闭,不是所有的内核版本都支持

epoll_wait:该函数用于等待所监控文件描述符上有事件的产生。

//返回就绪的文件描述符个数
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)

其中,

  • events:用来存内核返回的事件的集合

  • maxevents:告之内核这个events有多大,不能大于epoll_create()时的size;

  • timeout:是**超时时间,**指明要等待多久;

  • 返回值:成功返回有n个文件描述符就绪,时间到时返回0,出错返回-1

参考资料
(主要资料)社长本人的文章

以上是关于Linux的epoll用法与数据结构dataevent的主要内容,如果未能解决你的问题,请参考以下文章

Linux epoll 实现原理

linux epoll用法

[杂烩]Windows IOCP与Linux的epoll机制对比

select 和 epoll 区别

epoll知识点总结

Unix/Linux 编程:网络编程之 epoll与Reactor