I/O复用select poll epoll

I/O复用使得程序能够监听多个文件描述符
应用场景:1、客户端要同时处理多个socket(非阻塞connet技术)
2、客户端程序要同时处理用户输入和网络连接(聊天室程序)
3、TCP服务器同时处理监听socket和连接socket
4、服务器要同时处理TCP请求和UDP 请求
5、服务器要同时监听多个端口,或者多种服务
实现I/O的三种系统调用:
一、select
在一段指定时间内,监听用户感兴趣的文件描述符上的可读,可写和异常等事件。
原型:

#include<sys/select.h>

int select(int nfds,fd_set* readfds, fd_set*writefds,fd_set* exceptfds,struct timeval* timeout)

                nfds :指定被监听的文件描述符的总数,通常被设置为select监听的所有文件描述符中的最大值加1,因为文件描述符都是从0开始的
                fd_set* readfds, fd_set*writefds,fd_set* exceptfds分别指向可读,可写,异常事件对应的文件描述符集合,
                select调用返回后,内核将修改他们来通知应用程序哪些文件描述符已经就绪。
                timeout参数用来设置select函数的超时时间,是一个timaval结构类型的指针,采用指针参数是因为内核将修改它以告诉应用程序select等待了多久

二、poll

   在指定时间内轮询一定数量的文件描述符,以测试其中是否有绪

#include

  struct pollfd
    {
        int fd;
        short events;
        short revents;
    }

这里写图片描述
三、epoll
是linux特有的I/O复用函数。epoll使用一组函数来完成任务,而不是单个函数。epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,无需像select和poll那样每次调用都要重复传入文件描述符集或事件集。但epoll需要使用一个额外的文件描述符,来唯一标识内核中的这个事件表

#include<sys/epoll.h>
int epoll_create(int size)//事件表需要多大
#include<sys/epoll.h>
int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event)
//fd参数是要操作的文件操作符,op参数则指定操作类型,操作类型有如下3种:
EPOLL_CTL_ADD,往事件表中注册fd上的事件
EPOLL_CTL_MOD,修改fd上的注册事件
EPOLL_CTL_DEL,删除fd上的注册事件

epoll系列系统调用的主要接口是epoll_wait函数,它在一段超时时间内等待一组文件描述符上的事件

#include<sys/epoll.h>
int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout);

epoll_wait函数如果检测到事件,将所有的就绪的事件从内核事件表(由epfd参数指定)中复制到它的第二个参数events指向的数组中
LT(电平触发)和ET(边沿触发)模式:
LT是默认的工作模式,ET模式是epoll的高效模式
对采用的LT工作模式的文件描述符,当epoll_wait检测到其上有事件发生并将此事件通知给应用程序,应用程序可以不立即处理该事件,当应用程序下一次调用epoll_wait时,epoll_wait还会向此应用程序通告此事件,直到事件被处理
采用ET工作模式的文件描述符,当epoll_wait检测到其上有事件发生并将其通知给应用程序,应用程序必须立即处理该事件,因为后续的epoll_wait调用将不再向应用程序通知这一事件。ET模式在很大程度上降低了同一个epoll事件被触发的次数,效率要比LT模式高

select和poll,epoll的区别:
select用户只可传入的事件类型比较少,可读,可写,异常,内核通过对这些参数的在线修改来反馈其中的就绪时间,这使得用户每次调用select都要重置这3个参数
poll统一处理所有的事件类型,因此只需要一个事件集参数。用户通过pollfd.events传入感兴趣的事件,内核通过pollfd.revents反馈其中就绪的事件
epoll内核通过一个事件表直接管理用户感兴趣的所有事件,因此每次调用epoll_wait时,无需反复传入用户感兴趣的事件。epoll_wait系统调用的参数events仅用来反馈就绪的事件。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值