liunx io模型多路复用

news2024/11/23 23:50:12

多路复用

应用程序中同时处理多路输入输出流,若采用阻塞模式,得不到预期的目的;

若采用非阻塞模式,对多个输入进行轮询,但又太浪费CPU时间;

若设置多个进程/线程,分别处理一条数据通路,将新产生进程/线程间的同步与通信问题,使程序变得更加复杂;

 比较好的方法是使用I/O多路复用技术。其(select)基本思想是:

 1.先构造一张有关描述符的表(最大1024),然后调用一个函数。

 2.当这些文件描述符中的一个或多个已准备好进行I/O时函数才返回。

3. 函数返回时告诉进程哪个描述符已就绪,可以进行I/O操作。

select

通过man手册得到函数的用法及参数:

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);

功能:

实现IO的多路复用

参数:

nfds:关注的最大的文件描述符+1

readfds:关注的读表

writefds:关注的写表

exceptfds:关注的异常表

timeout:超时的设置

编程步骤:

  1. 构造一张关于文件描述符的表
  2. 清空表 FD_ZERO
  3. 将关心的文件描述符添加到表中 FD_SET
  4. 调用select函数,监听 select
  5. 判断到底是哪一个或者是哪些文件描述符发生了事件 FD_ISSET
  6. 做对应的逻辑处理 

通过代码实现:输入鼠标的时候, 响应鼠标事件, 输入键盘的时候, 响应键盘事件 (两路IO)


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

int main(int argc, char const *argv[])
{
    char buf[128] = {0}; // 用于存储读取的数据
    int fd = open("/dev/input/mouse0", O_RDONLY); // 打开鼠标设备文件
    if (fd < 0)
    {
        perror("open err"); // 打开文件出错
        return -1;
    }

    fd_set rfds; // 文件描述符集合
    while (1)
    {
        FD_ZERO(&rfds); // 清空文件描述符集合
        FD_SET(fd, &rfds); // 将鼠标设备的文件描述符加入集合
        FD_SET(STDIN_FILENO, &rfds); // 将标准输入的文件描述符(键盘)加入集合

        // 监听文件描述符是否有可读事件
        int ret = select(fd + 1, &rfds, NULL, NULL, NULL);
        if (ret < 0)
        {
            perror("select err"); // select 出错
            close(fd);
            return -1;
        }

        // 检查标准输入是否有数据可读
        if (FD_ISSET(STDIN_FILENO, &rfds))
        {
            fgets(buf, sizeof(buf), stdin); // 从标准输入读取数据
            printf("键盘输入: %s\n", buf);
        }

        // 检查鼠标设备是否有数据可读
        if (FD_ISSET(fd, &rfds))
        {
            ssize_t n = read(fd, buf, sizeof(buf)); // 从鼠标设备读取数据
            if (n < 0)
            {
                perror("read err"); // 读取设备出错
            }
            else
            {
                printf("鼠标数据: ");
                for (ssize_t i = 0; i < n; ++i)
                {
                    printf("%02x ", (unsigned char)buf[i]); // 以十六进制打印鼠标数据
                }
                printf("\n");
            }
        }

        memset(buf, 0, sizeof(buf)); // 清空缓冲区
    }
    close(fd); // 关闭文件描述符

    return 0;
}

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

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

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点&#xff1a; 1.确保子表中的某个字段&#xff08;外键&#xff09;只能引用父表中的有效记录 2.主表中的列被删除时&#xff0c;子表中的关联列也会被删除 3.主表中的列更新时&#xff0c;子表中的关联…

KAN 学习 Day4 —— MultKAN 正向传播代码解读及测试

在KAN学习Day1——模型框架解析及HelloKAN中&#xff0c;我对KAN模型的基本原理进行了简单说明&#xff0c;并将作者团队给出的入门教程hellokan跑了一遍&#xff1b; 在KAN 学习 Day2 —— utils.py及spline.py 代码解读及测试中&#xff0c;我对项目的基本模块代码进行了解释…

Ubuntu上安装libdc1394-22-dev出现无法定位安装包的解决办法

一、libdc1394-22-dev介绍 libdc1394-22-dev 是一个开发库&#xff0c;用于与IEEE 1394 (FireWire)摄像头进行交互。具体来说&#xff0c;它是 libdc1394 的开发版本&#xff0c;提供了开发者头文件和链接库&#xff0c;方便在应用程序中集成对基于 IEEE 1394 标准的数码相机的…

【开源大模型生态5】解放大脑

AI能力的进化&#xff0c;如上图&#xff0c;分为4个阶段。 第一阶段&#xff1a;逻辑推理为主 在人工智能的早期发展阶段&#xff0c;研究者们将重心放在了构建能够进行逻辑推理的系统上。这些系统通常基于规则&#xff0c;通过定义一系列“如果...那么...”的规则来模拟人类…

此mac无法连接Applie媒体服务,因为“”出现问题。

出现问题&#xff1a; 这是因为mac登陆过别人的appId下载过软件&#xff0c;但是没有完全退出登陆 解决 打开偏好设置&#xff0c;点击头像&#xff0c;点击媒体与已购项目&#xff0c;能看到弹框内AppleID登陆的应用&#xff0c;打开对应的那个应用&#xff0c;我这里是音…

Linux文本内容管理命令

head与tail head----显示文件前10行 tail----显示文件后10行 查看前n行命令&#xff1a; head -n 文件路径 查看后n行命令&#xff1a; tail -n 文件路径 管道符&#xff1a; | ----将前一输出的结果作为后一命令的输入 查看第三行内容&#xff1a;head -3 文件路…

损坏SD数据恢复的8种有效方法

SD卡被用于许多不同的产品来存储重要数据&#xff0c;如图片和重要的商业文件。如果您的SD卡坏了&#xff0c;您需要SD数据恢复来获取您的信息。通过从损坏的SD卡中取回数据&#xff0c;您可以确保重要文件不会永远丢失&#xff0c;这对于工作或个人原因是非常重要的。 有许多…

如何在产品创新中实践TRIZ方法?

TRIZ&#xff08;发明问题解决理论&#xff09;作为一种强大的创新方法论&#xff0c;自其诞生以来&#xff0c;便以其系统性、科学性和实用性&#xff0c;在全球范围内被广泛应用于产品创新、技术升级及难题解决等领域。本文&#xff0c;深圳天行健企业管理咨询公司旨在分享如…

合作文章|基于FFPE样本研究腹水微生物群与HCC继发腹水、PVTT之间的相互作用

文章题目&#xff1a;Ascitic microbiota alteration is associated with portal vein tumor thrombosis occurrence and prognosis in hepatocellular carcinoma 发表期刊&#xff1a;mBio 影响因子&#xff1a;6.4 研究背景 肝细胞癌(HCC)是最常见的恶性肿瘤之一&#xf…

D45XT160-ASEMI新能源专用D45XT160

编辑&#xff1a;ll D45XT160-ASEMI新能源专用D45XT160 型号&#xff1a;D45XT160 品牌&#xff1a;ASEMI 封装&#xff1a;DXT-5 安装方式&#xff1a;直插 批号&#xff1a;2024 现货&#xff1a;50000 正向电流&#xff08;Id&#xff09;&#xff1a;45A 反向耐压…

环球团队迅速崛起,把握最新市场趋势引领未来

近日&#xff0c;一个名为“环球团队”的股票投资团队在业内迅速崭露头角&#xff0c;备受瞩目。该团队由多位在金融证券领域经验丰富、见解独到的专家组成&#xff0c;很快赢得了投资者的信任和支持。他们凭借精准的市场分析和高效的投资策略&#xff0c;多次成功抓住市场机遇…

ceph-radosgw 手动安装教程以及安装问题解决办法

一、环境 操作系统版本&#xff1a;Ubuntu20.04 x86_64 ceph版本&#xff1a;ceph version 15.2.17 (8a82819d84cf884bd39c17e3236e0632ac146dc4) octopus (stable) radosgw版本&#xff1a;15.2.17 二、ceph-radosgw 安装步骤 ceph官方英文版教程&#xff0c;写了个大概步骤…

echarts 饼图中间文字颜色小写设置

想要实现的效果如下&#xff1a; 只要在formatter里这样写就可以啦&#xff0c;rich里面写你需要的样式即可 var option {color: [#3d6dfe, #27b3ff, #2fffc1, #ff892f, #fcff2f],tooltip: {trigger: item},legend: {type: scroll,itemWidth: 12,itemHeight: 10,itemGap: 25,…

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动&#xff0c;这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高…

交换机的这些接口,网工真得清楚

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 交换机作为网络的核心设备之一&#xff0c;在实现高效的数据传输和网络管理方面扮演着非常重要的角色。 然而&…

echarts 多个3D柱状图

图片样式&#xff1a; 代码实现&#xff1a; <template><div :class"className" :style"{height:height,width:width}" /> </template><script> require("echarts/theme/sakura"); // echarts themeexport default {pro…

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p37628 6月16日&#xff0c;小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞&#xff0c;这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示&#xff0c;公司准备量产&#xff0c;并计划今年四季度开启预…

Leetcode122. 买卖股票 状态机dp C++实现

Leetcode 122. 买卖股票的最佳时机 问题&#xff1a;给你一个整数数组 prices &#xff0c;其中 prices [ i ] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在…

AOC商用显示器赋能绿色教育,助推教育信息化发展

摘要&#xff1a;助推教育发展&#xff0c;打造健康教学&#xff01; 作为提高国家创新能力及综合素养的基础&#xff0c;教育水平的高低往往决定着人才培养的数量和质量&#xff0c;决定着国家科技发展水平的高低&#xff0c;甚至于决定着民族国家的成败兴衰。从长远规划来看…

跨平台数据库管理软件SQLynx

什么是 SQLynx &#xff1f; SQLynx 是一个原生基于 Web 的 SQL 编辑器&#xff0c;支持企业的桌面和 Web 数据库管理。它最初被称为 SQL Studio&#xff0c;后来改名为 SQLynx。SQLynx 支持所有流行的数据库&#xff0c;如 MySQL、MariaDB、PostgreSQL、SQLite、Hive、Impala、…