网络编程--IO多路复用之select,poll和epoll详解

什么是socket?什么是I/O操作?

我们都知道unix(Linux)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。不过话说回来了 ,计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是文件描述符,即通常所说的fd,一个fd就是一个整数,所以,对这个整数的操作,就是对这个文件(流)的操作。我们创建一个socket,通过系统调用会返回一个文件描述符,那么剩下对socket的操作就会转化为对这个描述符的操作。不能不说这又是一种分层和抽象的思想。

IO操作具体又分两部分:
第一部分:等待数据的就绪,也就是文件描述符上有事件就绪,我们才可以对其进行IO操作
第二部分:数据搬迁,说白了就是将一个文件中的数据搬到另一个文件中

什么是IO多路复用/转接

I/O多路复用实际上就是用select, poll, epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。

IO多路复用可以大大的降低等待事件就绪的时间,从而有效的提高IO效率。

下面介绍三种IO复用的接口实现,原理解释以及三种方式的对比,如果想结合对应的具体代码了解,请戳这里->select、poll、epoll服务器编写


select详解

具体介绍和实现

#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, 
            fd_set *exceptfds, struct timeval *timeout);
//参数nfds是需要监听的最大的文件描述符值+1
//rdset,wrset,exset分别对应需要检测的可读文件描述符的集合,
//可写文件描述符的集合集异常文件描述符的集合
//参数timoout为结构timeval,用来设置select()的等待时间
  1. 用户将自己所关心的文件描述符添加进描述符
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值