IO多路复用简介和代码实例(select函数)

接上篇

阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介-CSDN博客文章浏览阅读95次。阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介https://blog.csdn.net/CSDN_DU666666/article/details/139598410?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139598410%22%2C%22source%22%3A%22CSDN_DU666666%22%7D

基本思想:

        构造一个关于文件描述符的表,将所以要监视的文件描述符都放在这个表里

        将这个表传给一个函数 (select poll epoll),这个函数默认也是阻塞的

        当监视的文件描述中有一个或多个文件描述符准备就绪的时候

        函数会立即返回,并告诉调用者哪些文件描述符已经就绪了

        我们已经知道哪些文件描述符就绪了,再去执行对应的io操作,就不会阻塞了

select函数

功能:实现多路IO复用
头文件:#include <sys/select.h>
函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
参数:nfds:		要监视的最大文件描述符+1readfds:	要监视的读文件描述符集合 不关心可以传NULLwritefds:	要监视的写文件描述符集合 不关心可以传NULLexceptfds:	要监视的异常文件描述符集合 不关心可以传NULLtimeout:	超时时间 如果设置成NULL 会一直阻塞 直到有文件描述符就绪
返回值:成功 就绪的文件描述符的个数超时 0失败 -1 重置错误码 注意事项:1.select只能监视小于FD_SETSIZE(1024)的文件描述符2.select返回时会将没有就绪的文件描述符在集合中擦除所以循环中使用select时 每次需要重置集合3.我们一般只关心读文件文件描述符集合 其他两个置NULL即可void FD_CLR(int fd, fd_set *set);	//将文件描述符在集合中删除int  FD_ISSET(int fd, fd_set *set);	//判断文件描述符是否还在集合中// 返回0 表示不在了 非0 表示在void FD_SET(int fd, fd_set *set);	//向集合中添加一个文件描述符void FD_ZERO(fd_set *set);			//清空集合

service.c

首先创建三个管道文件

指令:mkfifo fifo1  

          mkfifo fifo2

          mkfifo fifo3

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>int main(int argc, const char *argv[]){int fd1 = open("fifo1", O_RDONLY);int fd2 = open("fifo2", O_RDONLY);int fd3 = open("fifo3", O_RDONLY);char buff[128] = {0};//创建文件描述符集合fd_set readfds;//母本FD_ZERO(&readfds);fd_set readfds_temp;//副本 用来给select每次擦除用FD_ZERO(&readfds_temp);int max_fd = 0;//用来记录最大的文件描述符//将要监视的文件描述符添加到集合中FD_SET(fd1, &readfds);max_fd = max_fd>fd1 ? max_fd : fd1;FD_SET(fd2, &readfds);max_fd = max_fd>fd2 ? max_fd : fd2;FD_SET(fd3, &readfds);max_fd = max_fd>fd3 ? max_fd : fd3;
#if 0//基础版while(1){//select返回时会将没有就绪的文件描述符在集合中擦除//所以循环中使用select时 每次需要重置集合readfds_temp = readfds;if(-1 == select(max_fd+1, &readfds_temp, NULL, NULL, NULL)){perror("select error");}//程序执行到这儿 说明有文件描述符就绪了//我们需要判断谁就绪了if(FD_ISSET(fd1, &readfds_temp)){memset(buff, 0, 128);read(fd1, buff, 128);printf("fifo1:[%s]\n", buff);}if(FD_ISSET(fd2, &readfds_temp)){memset(buff, 0, 128);read(fd2, buff, 128);printf("fifo2:[%s]\n", buff);}if(FD_ISSET(fd3, &readfds_temp)){memset(buff, 0, 128);read(fd3, buff, 128);printf("fifo3:[%s]\n", buff);}}
#endif#if 1
//进阶版//基础版int ret = 0;int i = 0;while(1){readfds_temp = readfds;if(-1 == (ret = select(max_fd+1, &readfds_temp, NULL, NULL, NULL))){perror("select error");}//遍历文件描述符集合 谁还在里面说明谁就绪for(i = 3; i < max_fd+1 && ret != 0; i++){if(FD_ISSET(i, &readfds_temp)){memset(buff, 0, 128);read(i, buff, 128);printf("buff[%d-3]:[%s]\n",i, buff);ret--;//此处的ret--是为了提高效率的}}}
#endifclose(fd1);close(fd2);close(fd3);return 0;
}

client.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(int argc, const char *argv[]){int fd = open("fifo1", O_WRONLY);//fifo2 fiof3char buff[128] = {0};while(1){memset(buff, 0, 128);printf("请输入:");fgets(buff, 128, stdin);buff[strlen(buff)-1] = '\0';write(fd, buff, 128);}close(fd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven引入依赖时莫名报错

一般跟依赖的版本无关&#xff0c;会报出 Cannot resolve xxx 的错误。 这种情况下去IDEA的setting中找maven的仓库位置 在仓库中顺着包路径下寻找&#xff0c;可能会找到.lastUpdated 的文件&#xff0c;这样的文件一般是下载失败了&#xff0c;而且在一段时间内不再下载&…

windows环境下配置git环境变量

路由当前目录 vim 打开 .bash_profile PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.4.3nts PATH$PATH:/d/phpstudy_pro/Extensions/php8/php8.2.9nts PATH$PATH:/d/phpstudy_pro/Extensions/composer2.5.8 …

Downie for Mac v4.7.17 在线视频下载软件 安装(简单易学,小白轻松搞定)

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;进行设置2、下载视频&#xff0c;测试3、根据需要选…

凡尔码来访登记卡助力来访安全

来访登记制度是指为了加强对来访人员的管理和安全控制&#xff0c;确保组织内部秩序和安全的一项制度。通过来访登记制度&#xff0c;可以对来访人员的身份进行核实&#xff0c;了解来访目的&#xff0c;并采取相应的安全措施&#xff0c;为组织内部的工作和人员安全提供保障。…

登录/注册- 滑动拼图验证码(IOS/Swift)

本章介绍如何使用ios开发出滑动拼图验证码&#xff0c;分别OC代码和swift代码调用 1.导入项目model文件OC代码&#xff08;下载完整Demo&#xff09; 2.放入你需要显示的图片 一&#xff1a;OC调用 #import "ViewController.h" #import "CodeView.h"…

ArrayList浅析

目录 一、ArrayList源码1.1 迭代器1.1.1 Itr源码浅析1.1.2 ListItr源码浅析 1.2 常用方法1.3 System.arraycopy1.4 ArrayList 的创建方式 二、引申问题2.1 ArrayList的大小是如何增加的&#xff1f;2.2 什么情况下你会使用ArrayList2.3 在索引中ArrayList的增加或者删除某个对象…

【无标题】QTday1

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QMainWindow(parent) {//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\雷特玉\\Desktop\\qq.png"));//设置窗口的背景颜色t…

Springboot(若依)国际化配置接口访问后返回????????

最近使用若依的框架进行二次开发&#xff0c;配置了国际化&#xff0c;application.yml配置英文时没问题&#xff0c;但配置中文basename: i18n/messages_zh_CN&#xff0c;访问接口就直接返回的???&#xff0c;如图&#xff1a; 于是检查了I18nConfig文件&#xff0c;没配错…

MathWorks的介绍,以及Simscape 的主要特点

MathWorks 是一家美国的软件公司&#xff0c;以其科学计算软件为广泛知名&#xff0c;特别是 MATLAB 和 Simulink。这两款产品广泛用于工程、科学研究、学术界和工业应用中&#xff0c;帮助用户进行数学计算、算法开发、数据可视化、数据分析&#xff0c;以及仿真和模型构建。 …

每日5题Day23 - LeetCode 111 - 115

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeN…

探索Java 8 Stream API:现代数据处理的新纪元

Stream流 Stream初探&#xff1a;何方神圣&#xff1f; Stream流是一种处理集合数据的高效工具&#xff0c;它可以让你以声明性的方式处理数据集合。Stream不是存储数据的数据结构&#xff0c;而是对数据源&#xff08;如集合、数组&#xff09;的运算操作概念&#xff0c;支…

python绘制散点图

文章目录 1.实验目的2.需求3. 代码以及资源文件4.实验结果 1.实验目的 掌握Python绘图库matplotlib库 2.需求 3. 代码以及资源文件 import numpy as np import matplotlib.pyplot as plt import pandas as pd# 读取NPZ文件 data np.load(../Files/国民经济核算季度数据.npz…

cilium关闭vxlan

说明 操作 启用标志 yum -y install net-tools.x86_64 ifconfig | grep vxlan cilium_vxlan: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500修改相关配置 ks get cm cilium-config -oyaml | grep -E tunnel|ipv4-native-routing-cidr|auto-direct-node-routes…

【OceanBase DBA早下班系列】—— 性能问题如何 “拍CT“ (一键获取火焰图和扁鹊图)

1. 前言 最近接连遇到几个客户的环境在排查集群性能问题&#xff0c;总结了一下&#xff0c;直接教大家如何去获取火焰图、扁鹊图&#xff08;调用关系图&#xff09;&#xff0c;直击要害&#xff0c;就像是内脏的疾病去医院看病&#xff0c;上来先照一个CT&#xff0c;通过分…

for循环结构

循环&#xff1a; 循环是一个重复执行一个代码的结构。只要满足循环的条件&#xff0c;会一直执行这个代码。 循环条件&#xff1a;在一定范围之内&#xff0c;按照指定的次数来执行循环。 循环体&#xff1a;在指定的次数内&#xff0c;执行的命令序列。只要条件满足&#…

【iOS】KVC相关总结

目录 1. 什么是KVC&#xff1f;2. 访问对象属性常用方法声明基础使用KeyPath路径多值操作 3. 访问集合属性4. 集合运算符自定义集合运算符 5. 非对象值处理访问基本数据类型访问结构体 6. 属性验证7. 设值和取值原理基本的Getter搜索模式基本的Setter搜索模式NSMutableArray搜索…

Windows本地使用SSH连接VM虚拟机

WIN10 VM17.5 Ubuntu:20.04 1.网路设置 1)选择编辑->更改设置 配置完成 2.修改了服务器文件&#xff0c;修改sshd配置&#xff0c;在此文件下/etc/ssh/sshd_config&#xff0c;以下为比较重要的配置 PasswordAuthentication yes PermitRootLogin yes PubkeyAuthenticat…

[ue5]建模场景学习笔记(6)——必修内容可交互的地形,交互沙(4)

1.需求分析&#xff1a; 现在我们已经有了可以在世界内近于无限的跑动痕迹&#xff0c;现在需要对痕迹进行细化&#xff0c;包括例如当人物跳起时便不再绘制痕迹&#xff0c;以及痕迹应该存在深浅&#xff0c;应该由两只脚分别绘制&#xff0c;同时也应该对地面材质进行进一步处…

Vue基本使用-02

上节我们讲了什么是mvvm模型&#xff0c;以及我们vue的一些常用指令&#xff0c;今天给大家讲一下vue的基本使用&#xff0c;在将之前我们需要重点讲解我们的一个指令&#xff0c;v-model指令 v-model v-model 可以在组件上使用以实现双向绑定,什么是双向绑定呢?意思就是当我们…

景芯SoC A72的时钟树分析

innovus的ctslog中的Clock DAG信息可以报出来CTS主要运行步骤的关键信息&#xff0c;比如clustering&#xff0c;balancing做完后的clock tree的长度&#xff0c;clock tree上所用的buffer、inverter&#xff0c;icg cell数量&#xff0c;clock skew等信息。我们以景芯SoC A72 …