什么是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()的等待时间
- 用户将自己所关心的文件描述符添加进描述符