IO多路复用

首先是为什么需要io多路复用

处理事件有很多方式 最经典就是轮询模式

while(ture)

{

read()//阻塞

write()//阻塞 

}

      这样的话就相当于while里一直空转read转完write才能转 效率较低

      可以有一种方法效率更高,就是假设read他会有个状态1/0write也会1/0当其中某一个为1时等5秒    

        超过不等了先干下一件事 (可能说得不太好)进行下一个循环,这样就不会说会一直以阻塞的方式卡在read上,read没准备好,就write。简单来说就是将文件描述符(句柄)保存在一个位置,哪个文件描述符准备好了,就放他出来干活

使用:poll:poll(fds, nfds, 5000);fds是文件描述符集合,nfds:nfds_t类型的参数,用于标记数组fds中的结构体元素的总数量;最后一个是超时时间  毫秒单位

struct pollfd fds[1];定义一个他的结构体 

nfds_t nfds = 1;

fds[0].fd = fd;
fds[0].events  = POLLIN;期待的状态 读
fds[0].revents = 0;

ret = poll(fds, nfds, 5000);>0有数据了 = 0超时 

if (fds[0].revents == POLLIN){开始读}

填充结构体的内容 fds.fd[0] = fd (某个操作的文件描述符)

    struct pollfd {

      int fd;

        short evernts

       short revents

}

select 

int select (int maxfd + 1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval * timeout);

FD_ZERO(fd_set *fdset):清空fdset与所有文件句柄的联系。 
FD_SET(int fd, fd_set *fdset):建立文件句柄fd与fdset的联系。 
FD_CLR(int fd, fd_set *fdset):清除文件句柄fd与fdset的联系。 
FD_ISSET(int fd, fdset *fdset):检查fdset联系的文件句柄fd是否可读写,>0表示可读写。
 

selec和poll的区别:

主要区别select是个定长数组1024放fd poll的话自己定义长度

等待时间的单位 poll是毫秒 selec是微妙

本质上其实没啥区别都是有个超时时间,在规定时间内期望做什么,感受到期望事件可以执行立刻返回,不然等到超时返回其他值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值