系统编程之高级文件IO(十五)——poll,epoll简单使用和异步IO及总结
一、poll
基本原理与select一致, 也是轮询+遍历;唯一的区别就是poll没有最大文件描述符限制(使用链表的方式存储fd)
原型:int poll(struct pollfd *fds, nfds_t nfds, int time out);
POLLIN可读
POLLPUT可写
POLLERR异常
nfds:数组个数
timeout:延迟时间
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <poll.h>
int main(int argc, char const *argv[])
{
int fd;
if((fd = open("/dev/input/mouse0", O_RDWR | O_CREAT, 0655)) < 0)
{
perror("open file error!");
exit(1);
}
struct pollfd fds[2];
fds[0].fd = 0;
fds[0].events = POLLIN;
fds[1].fd = fd;
fds[1].events = POLLIN;
while(1)
{
int ret = poll(fds, 2, -1);
for (size_t i = 0; i < 2; i++)
{
if (fds[i].events == fds[i].revents)
{
if (fds[i].fd == 0)
{
char buffer[1024];
read(fds[i].fd, buffer, sizeof(buffer));
printf("buffer = %s\n",buffer);
}
else if (fds[i].fd == fd)
{
int cor;
read(fds[i].fd, &cor, sizeof(cor));
printf("cor = %d\n", cor);
}
if (--ret == 0)
{
break;
}
}
}
}
return 0;
}
二、epoll
自学
select内部使用数组实现,poll是链表。他们需要做内核区到用户区的转换,还需要做数据拷贝,因此效率低。
epoll不需要做内核区到用户区的转换。因为数据存在共享内存中。epoll维护的树在共享内存中,epqJ维护的树在共享内存中,内核区和用户区去操作共享内存,因此不需要区域转换,也不需要
三、异步IO
进程和网络时再讲,select也算异步,但是有阻塞,一旦阻塞就是同步
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理