Linux的epoll用法与数据结构data、event

简介: Linux的epoll用法与数据结构data、event

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

参考资料

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

相关文章
|
1月前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
84 3
|
1月前
|
存储 JSON Java
细谈 Linux 中的多路复用epoll
大家好,我是 V 哥。`epoll` 是 Linux 中的一种高效多路复用机制,用于处理大量文件描述符(FD)事件。相比 `select` 和 `poll`,`epoll` 具有更高的性能和可扩展性,特别适用于高并发服务器。`epoll` 通过红黑树管理和就绪队列分离事件,实现高效的事件处理。本文介绍了 `epoll` 的核心数据结构、操作接口、触发模式以及优缺点,并通过 Java NIO 的 `Selector` 类展示了如何在高并发场景中使用多路复用。希望对大家有所帮助,欢迎关注威哥爱编程,一起学习进步。
|
2月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
36 0
Linux C/C++之IO多路复用(poll,epoll)
|
2月前
|
Ubuntu Linux
Linux的基础用法
Linux的基础用法
24 6
|
3月前
|
监控 Linux
Linux系统中du命令与df命令的区别与用法
总的来说,`du` 和 `df` 在磁盘管理中互补使用,能够提供全面的磁盘空间使用信息,帮助用户和管理员有效地监控和管理系统资源。
98 3
|
3月前
|
存储 Ubuntu Linux
linux中的find 命令详细用法
本文介绍了如何将 `find` 命令与 `exec` 结合使用,通过具体示例展示了多种应用场景,如显示文件属性、重命名文件、收集文件大小、删除特定文件、执行工具、更改文件所有权和权限、收集 MD5 值等。文章还探讨了 `{} \;` 和 `{} +` 的区别,并演示了如何结合 `grep` 命令进行内容搜索。最后,介绍了如何在一个 `find` 命令中使用多个 `exec` 命令。这为 Linux 用户提供了强大的文件管理和自动化工具。
|
4月前
|
Ubuntu Linux 开发工具
【事件中心 Azure Event Hub】在Linux环境中(Ubuntu)安装Logstash的简易步骤及配置连接到Event Hub
【事件中心 Azure Event Hub】在Linux环境中(Ubuntu)安装Logstash的简易步骤及配置连接到Event Hub
|
5月前
|
索引 Python
|
6月前
|
消息中间件 存储 监控
实战Linux I/O多路复用:借助epoll,单线程高效管理10,000+并发连接
本文介绍了如何使用Linux的I/O多路复用技术`epoll`来高效管理超过10,000个并发连接。`epoll`允许单线程监控大量文件描述符,显著提高了资源利用率。文章详细阐述了`epoll`的几个关键接口,包括`epoll_create`、`epoll_ctl`和`epoll_wait`,以及它们在处理并发连接中的作用。此外,还探讨了`epoll`在高并发TCP服务场景的应用,展示了如何通过`epoll`和线程/协程池来构建服务框架。
754 11
|
4月前
|
存储 运维 监控
运维.Linux下执行定时任务(上:Cron简介与用法解析)
运维.Linux下执行定时任务(上:Cron简介与用法解析)
61 0
下一篇
DataWorks