I/O复用函数,poll和epoll的用法与select、poll、epoll的区别

news/2025/1/21 15:19:04/

1.poll的接口介绍

        poll系统调用和select类似,也是在指定时间内轮询一定数量的文件描述符,已测试其中是否有就绪者。poll的原型如下:

# include <poll.h>
int poll(struct pollfd*fds,nfds_t nfds,int timeout);
poll系统调用成功返回就绪文件描述符的总数,超时返回0,失败返回-1
nfds参数指定被监听事件集合fds的大小。
timeout参数指定poll的超时值,单位是毫秒, timeout 为-1 时, poll 调用将永久
阻塞,直到某个事件发生, timeout 为 0 时, poll 调用将立即返回。
fds 参数是一个 struct pollfd 结构类型的数组,它指定所有用户感兴趣的文件描述
符上发生的可读、可写和异常等事件。 pollfd 结构体定义如下:
struct pollfd
{int fd; // 文件描述符short events; // 注册的关注事件类型short revents; // 实际发生的事件类型,由内核填充
};
其中, fd 成员指定文件描述符, events 成员告诉 poll 监听 fd 上的哪些事件类型。
它是一系列事件的按位或, revents 成员则有内核修改,通知应用程序 fd 上实际发
生了哪些事件。 

事件POLLIN,描述:数据可读

2.epoll的接口介绍

        epoll 是 Linux 特有的 I/O 复用函数。它在实现和使用上与 select、 poll 有很大差异。首
先, epoll 使用一组函数来完成任务,而不是单个函数。其次, epoll 把用户关心的文件描述
符上的事件放在内核里的一个事件表中。从而无需像 select 和 poll 那样每次调用都要重复传
入文件描述符或事件集。但 epoll 需要使用一个额外的文件描述符,来唯一标识内核中的这
个事件表。 epoll 相关的函数如下:
epoll_create()用于床建内核事件表

epoll_ctl()用于操作内核事件表

epoll_wait()用于在一段超时间内等待一组文件描述符上的事件

# include <sys/epoll.h>
int epoll_create(int size);
//epoll_create()成功返回内核事件表的文件描述符,失败返回-1
//size 参数现在并不起作用,只是给内核一个提示,告诉它事件表需要多大。
//int epoll_ctl(int epfd,int op,int fd,struct epoll_event*event);
epoll_ctl()成功返回 0,失败返回-1
//epfd 参数指定要操作的内核事件表的文件描述符
//fd 参数指定要操作的文件描述符
//op 参数指定操作类型:EPOLL_CTL_ADD 往内核事件表中注册 fd 上的事件EPOLL_CTL_MOD 修改 fd 上的注册事件EPOLL_CTL_DEL 删除 fd 上的注册事件
//event 参数指定事件,它是 epoll_event 结构指针类型
int epoll_wait(int epfd,struct epoll_event*events,int maxevents,int timeout);
//epoll_wait()成功返回就绪的文件描述符的个数,失败返回-1,抄实返回0
//epfd 参数指定要操作的内核事件表的文件描述符
//events 参数是一个用户数组,这个数组仅仅在 epoll_wait 返回时保存内核检测到
的所有就绪事件,而不像 select 和 poll 的数组参数那样既用于传入用户注册的事
件,又用于输出内核检测到的就绪事件。这就极大地提高了应用程序索引就绪文件
描述符的效率。
//maxevents 参数指定用户数组的大小,即指定最多监听多少个事件,它必须大于
0
//timeout 参数指定超时时间,单位为毫秒,如果 timeout 为 0,则 epoll_wait 会立即
返回,如果 timeout 为-1,则 epoll_wait 会一直阻塞,直到有事件就绪。

2.1 LT和ET模式

        epoll对文件描述符有两种操作模式:LT模式和ET模式。LT模式是默认工作模式。当epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以高效的ET模式来操作该文件描述符。

        对于LT模式操作的文件描述符,当epoll_wait检测到其上有事物发生并将此事通知应用程序后,应用程序可以不立即处理该事物。这样,当应用程序下一次调用epoll_wait时,还会再次向应用程序通告此事件,直到该事件被处理。

        对于ET模式操作的文件描述符,当epoll_wait检测到其上有事件,并将此事件通知应用程序后,应用程序必须立即处理该事件,因为后续的epoll_wait调用将不再向应用程序通知这一事件。所以ET模式在很大程度上降低了同一个epoll事件被重复触发的次数,因此效率该与LT模式。

epoll实现tcp服务器代码如下:

设置文件为非阻塞模式

void SetNoWait(int fd)
{int old_option=fcntl(fd,F_GETFL);int new_option=old_option|O_NONBLOCK;fcntl(fd,F_SETFL,new_option);
}

关闭客户端连接

void CloseClient(int epfd, int fd)
{close(fd);if (epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL) == -1){printf("epoll_ctl del error\n");}
}

获取一个新的客户端连接,如果 flag 为 ET,则以 ET 模式处理此客户端
 

 void GetClientLink(int sockfd, int epfd, int flag)
{struct sockaddr_in caddr;socklen_t len = sizeof(caddr);int c = accept(sockfd, (struct sockaddr*)&caddr, &len);if (c < 0){printf("Client Link error\n");return;}struct epoll_event ev;ev.data.fd = c;if (flag){ev.events = EPOLLIN | EPOLLRDHUP | EPOLLET;SetNoWait(c);}else{ev.events = EPOLLIN | EPOLLRDHUP;}if (epoll_ctl(epfd, EPOLL_CTL_ADD, c, &ev) == -1){printf("epoll_ctl add error\n");}}
}

文章来源:https://blog.csdn.net/qq_70799748/article/details/130328281
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/52132.html

相关文章

【计算机基础】绝对路径和相对路径

目录 一.绝对路径 二.相对路径 例如 三.举例 一.绝对路径 绝对路径是指从根目录开始的完整路径&#xff0c;包括所有父目录的路径&#xff0c;直到目标文件或者目录 所在的位置。 全文件名全路径文件名绝对路经完整的路径 例如&#xff0c;在windows系统中&#xff0c;绝…

CentOS----本地YUM源配置

1.cd /etc/yum.repos.d 2. cp -p CentOS-Media.repo M.repo mkdir yuan mv CentOS-* yuan 3. vi M.repo (修改配置文件内容如下,/mnt/cdrom 为yum源目录) 4.创建挂载目录 和 上面配置文件中file:///mnt/cdrom 一致 mkdir -p /mnt/cdrom 5.将本地yum 挂载到刚创建的文件…

破防了,这才是机房运维的高效方法

在云计算、5G等新业务野蛮生长的催化下&#xff0c;机房规模与容量也呈倍速扩张。机房安全是业务发展的底座。提升机房设备安全和管理效率&#xff0c;避免人为因素导致的事故发生&#xff0c;是机房运维的必要前提。 安全生产重于泰山&#xff0c;除了日常的科学防护&#xf…

Vulkan Programming Guide第11章——同步

你将在本章所学到的内容 如何在主机与设备之间进行同步如何在 同一 设备上 不同 队列中同步作业如何在流水线中的不同点上同步所执行的作业 Vulkan被设计为在一个设备上含有多个队列中进行异步、并行地运行作业&#xff0c;并且与主机一起协同&#xff0c;以保持物理资源始终…

《个人博客部署上线教程一》Halo搭建个人博客网站

Halo搭建个人博客网站 一、docker部署Halo 目前测试了两种方法安装Halo&#xff0c;第一种是使用Jar包安装:提供JAR包资源&#xff0c;不过因为使用jar包部署需要Java11才可以&#xff0c;我本机使用的是Java8&#xff0c;所以暂时不做调整。第二种是通过docker安装。 1.1 启…

CnOpenData中国汽车能源消耗量数据

一、数据简介 工业和信息化部组织制定的《乘用车燃料消耗量限值》强制性国家标准&#xff08;GB19578-2021&#xff09;于2021年7月1日起正式实施&#xff0c;该标准规定了燃用汽油或柴油燃料、最大设计总质量不超过3500kg的M1类车辆在今后一段时期的燃料消耗量限值要求&#x…

什么蓝牙耳机好?经销商分享线下热销蓝牙耳机品牌排行

开实体店铺多年&#xff0c;对数码行业多有研究&#xff0c;每天都会试用各种数码产品。网友们在发帖咨询什么蓝牙耳机好&#xff0c;为此我整理了实体店铺最受欢迎的蓝牙耳机品牌排行&#xff0c;大家在选购时可以作为备选&#xff1a; 第一款&#xff1a;JEET Air2蓝牙耳机 …

Java线程间通信方式(3)

前文了解了线程通信方式中的CountDownLatch&#xff0c; Condition&#xff0c;ReentrantLock以及CyclicBarrier&#xff0c;接下来我们继续了解其他的线程间通信方式。 Phaser Phaser是JDK1.7中引入的一种功能上和CycliBarrier和CountDownLatch相似的同步工具&#xff0c;相…