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 Python
Python网络编程基础(Socket编程)epoll在Linux下的使用
【4月更文挑战第12天】在上一节中,我们介绍了使用`select`模块来实现非阻塞IO的方法。然而,`select`模块在处理大量并发连接时可能会存在性能问题。在Linux系统中,`epoll`机制提供了更高效的IO多路复用方式,能够更好地处理大量并发连接。
|
14天前
|
消息中间件 存储 监控
实战Linux I/O多路复用:借助epoll,单线程高效管理10,000+并发连接
本文介绍了如何使用Linux的I/O多路复用技术`epoll`来高效管理超过10,000个并发连接。`epoll`允许单线程监控大量文件描述符,显著提高了资源利用率。文章详细阐述了`epoll`的几个关键接口,包括`epoll_create`、`epoll_ctl`和`epoll_wait`,以及它们在处理并发连接中的作用。此外,还探讨了`epoll`在高并发TCP服务场景的应用,展示了如何通过`epoll`和线程/协程池来构建服务框架。
156 3
|
17天前
|
XML Linux API
探索Linux中的dbus-binding-tool:理解其用途与用法
`dbus-binding-tool`是Linux D-Bus工具集的一部分,用于从XML接口描述生成语言绑定代码,简化D-Bus服务在应用程序中的集成。它支持自动代码生成,多种语言(如C、C++、Python),并提供灵活性以适应特定需求。使用步骤包括获取XML描述文件,运行工具生成代码,然后在应用中使用生成的API。注意版本兼容性、错误处理,并参考官方文档和示例以优化使用。该工具助力开发人员高效实现进程间通信和系统服务集成。
|
1月前
|
监控 Linux 数据处理
|
1月前
|
存储 Scala 索引
scala中常见数据结构的用法
scala中常见数据结构的用法
14 1
|
1月前
|
Linux 程序员 Shell
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
|
1月前
|
安全 网络协议 Linux
【专栏】Linux系统中ping命令的使用,包括其基本语法、输出信息、常用参数及高级用法
【4月更文挑战第28天】本文详细介绍了Linux系统中ping命令的使用,包括其基本语法、输出信息、常用参数及高级用法。通过ping,用户可测试网络连通性、诊断故障及评估性能。此外,文章还讨论了ping在不同协议、模拟网络环境及与其他命令结合使用时的场景。注意防火墙和网络环境可能影响ping结果,理解错误信息有助于网络问题排查。熟练掌握ping命令,能助你成为Linux网络专家。不断学习和实践,提升网络技能,为构建稳定网络环境贡献力量。
|
1月前
|
Linux
【专栏】Linux系统中"cd"命令的使用技巧,包括基本用法
【4月更文挑战第28天】本文介绍了Linux系统中"cd"命令的使用技巧,包括基本用法(如切换到指定目录)、利用"."和".."、"~"符号,以及绝对路径和相对路径切换。还分享了高级技巧,如使用通配符、结合其他命令和在脚本中的应用。通过学习这些技巧,可提升工作效率,如快速切换到项目目录或最近使用的目录。
|
1月前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,解锁高级用法,轻松驾驭复杂数据结构(30)
掌握Go语言:Go语言类型转换,解锁高级用法,轻松驾驭复杂数据结构(30)
|
18小时前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
11 5