目录
前言
本文主要学习Linux内核编程,结合Visual Studio 2019进行跨平台编程,内容包括IO复用技术相关知识介绍以及用服务器客户端实例说明(详细举例epoll的使用 )
一、IO复用基本概念
💻阻塞I/O
最流行的I/O模型是阻塞I/O模型,缺省时,所有的套接口都是阻塞的
💻非阻塞I/O
当我们把一个套接口设置为非阻塞方式时,即通知内核,当请求的I/O操作非得让进程睡眠不能完成时,不要让进程睡眠,而应返回一个错误
应用程序连续不断地查询内核,看看某操作是否准备好,这对CPU时间是极大的浪费,一般只在专门提供某种功能的系统中才会用到
💻I/O复用
有了I/O复用,我们就可以调用select或poll,在这两个系统调用的某一个上阻塞,而不是真正阻塞于真正的I/O系统调用
如果一个或多个I/O条件满足(例如:输入已准备好被读,或者描述字可以承接更多输出的时候)
我们就能够被通知到,这样的能力被称为I/O复用,是由函数select和poll支持的
I/O复用网络应用场合:
- 当客户处理多个描述字
- 一个客户同时处理多个套接口
- 如果一个TCP服务器既要处理监听套接口,又要处理连接套接口
- 如果一个服务器既要处理TCP,又要处理UDP
📌select 函数
select函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程
📍头文件:<sys/select.h> <sys/socket.h>
📍作用: 提供了即时响应多个套接的读写事件
📍原型:
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *except,
const struct timeval *timeout);
📍参数:
maxfdp1: 等待最大套接字值加1(等待套接字的数量)
readset:要检查读事件的容器
writeset:要检查写事件的容器
timeout: 超时时间
📍返回值: 返回触发套件接字的个数
📌poll 函数
poll函数和select类似,但它是用文件描述符而不是条件的类型来组织信息
也就是说,一个文件描述符的可能事件都存储在struct pollfd中
与之相反,select用事件的类型来组织信息,而且读,写和错误情况都有独立的描述符掩码
poll函数是POSIX:XSI扩展的一部分,它起源于UNIX System V
📍头文件: <poll.h>
📍作用: 提供了即时响应多个套接的读写事件
📍原型:
int poll(struct pollfd *fdarray,unsigned long nfds,int timeout);
📍参数:
fdarray:是一个pollfd的机构体数组用来表示表示文件描述符的监视信息