【IO多路复用】:允许同时对多个IO进行控制

本文介绍了IO多路复用的概念及其优点,重点讲解了select函数的工作原理和代码实例,展示了如何在一个线程内处理多个socket的IO请求。虽然存在如文件描述符数量限制和轮询效率问题等缺点,但在处理短作业和减少资源占用方面,IO多路复用模型具有显著优势,尤其适合构建简单的事件驱动服务器。
摘要由CSDN通过智能技术生成

1、多路复用的优点

在这里插入图片描述
2、select()函数—用于探测多个文件句柄的状态变化

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);
参数:
    nfds:最大文件描述符+1
	readfds:读事件的表
	writefds:写事件的表
	exceptfds:异常事件的表
	timeout:超时检测  NULL: 一直阻塞,直到文件描述符准备好为止
返回值: 
        成功: 准备好的文件描述符的个数 ;失败: -1
        
----------------------------------------------------------
void FD_CLR(int fd, fd_set *set); // 把表中删除一个文件描述符 
int FD_ISSET(int fd, fd_set *set); //检测文件描述符是否准备好了,准备好了返回1,否则返回0 
void FD_SET(int fd, fd_set *set); // 加入到表中 
void FD_ZERO(fd_set *set); // 清空表        
        

基本原理:首先创建一张文件描述符表(fd_set),通过使用特有的函数(select),让内核帮助上层用户循环检测是否有可操作的文件描述符,如果有则告诉应用程序去操作。

代码实例:(有名管道的应用)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>

int main(int argc, const char *argv[])
{
   
	int fd1 = open("./f1", O_RDWR);
	int fd2 = open("./f2", O_RDWR);
	int fd3 = open("./f3", O_RDWR);

	//1.创建一张文件描述符表
	fd_set readfds, tmpfds;
	
	FD_ZERO(&readfds); //2.清空表

	FD_SET(fd1, &readfds);
	FD_SET(fd2, &readfds);
	FD_SET(fd3, &readfds);

	int maxfd = fd3;

	tmpfds = readfds;

	char buf[64] = {
   0};

	int ret, i;

	while(1)
	{
   
		readfds = tmpfds
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值