C++之poll与epoll总结(一百六十九)

news2024/9/30 9:20:13

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解poll和epoll用法区别与总结。

2.代码示例

<1>.poll用法讲解

poll函数用于实现多路复用(multiplexing),即通过等待多个文件描述符上的事件发生来进行 I/O 操作,而不阻塞整个程序。它是一种用于实现非阻塞 I/O 的方法,可以提高程序的性能和响应能力。

poll函数的主要作用是监视一组文件描述符(通常是套接字)的状态,并在其中任何一个文件描述符上发生事件时进行相应处理。它可以同时监视多个文件描述符的可读、可写和异常事件。

以下是 poll 函数的一般用法:

int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • fds 是一个指向 pollfd 结构体数组的指针,每个结构体表示一个被监视的文件描述符及其关注的事件。
  • nfdsfds 数组中结构体的数量。
  • timeout 是指定的等待时间,单位是毫秒

<2>.poll代码实例

#include <iostream>
#include <poll.h>
#include <unistd.h>

int main() {
  // 创建 pollfd 数组
  struct pollfd fds[1];

  // 添加需要监听的套接字到 pollfd 数组中
  fds[0].fd = STDIN_FILENO;/* 套接字文件描述符 */;
  fds[0].events = POLLIN; // 监听可读事件

  // 开始监听事件
  while (true) {
    int ret = poll(fds, 1, -1);
    if (ret > 0) {
      if (fds[0].revents & POLLIN) {
	// 可读事件发生在套接字上
	char buffer[256];
	ssize_t bytesRead = read(STDIN_FILENO, buffer, sizeof(buffer) - 1);
	if (bytesRead > 0) {
	  buffer[bytesRead] = '\0';
	  std::cout << "Received input: " << buffer << std::endl;
	}
      }
    } else if (ret == -1) {
      std::cerr << "Error while polling" << std::endl;
      break;
    }
  }

  return 0;
}

<3>.epoll用法讲解

epoll是一个高效的事件通知机制,用于处理I/O事件。它是Linux操作系统提供的一种异步I/O模型,常用于服务器编程中。其主要作用是监听多个I/O事件,并在发生事件时进行相应的处理。

使用epoll机制可以避免传统的阻塞I/O模型中频繁的轮询操作,提高系统的性能和并发处理能力。它可以管理大量的文件描述符(sockets),并通过回调函数或其他方式提供有效的事件通知机制。当有I/O事件发生时,操作系统会通知应用程序,使得应用程序可以及时处理相关的I/O操作。

epoll通过三个函数epoll_create、epoll_ctl和epoll_wait来完成相关的操作。epoll_create用于创建一个epoll句柄(文件描述符),epoll_ctl用于添加、修改或删除监听的文件描述符,而epoll_wait则是等待事件的发生并进行处理。

总的来说,epoll在C++中的作用是提供高效的异步I/O事件通知机制,使得服务器程序可以高效地处理大量的并发连接和I/O操作。

<4>.epoll实例

#include <iostream>
#include <sys/epoll.h>
#include <unistd.h>

#define MAX_EVENTS 10
#define MAX_BUF_SIZE 1024

int main() {
    int epoll_fd, event_count;
    struct epoll_event event, events[MAX_EVENTS];
    char buffer[MAX_BUF_SIZE];

    // 创建epoll句柄
    epoll_fd = epoll_create1(0);
    if (epoll_fd == -1) {
        std::cerr << "Failed to create epoll file descriptor." << std::endl;
        return 1;
    }

    // 设置监听的文件描述符
    event.data.fd = STDIN_FILENO; // 监听标准输入
    event.events = EPOLLIN; // 监听可读事件

    // 将监听事件添加到epoll句柄中
    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &event) == -1) {
        std::cerr << "Failed to add file descriptor to epoll." << std::endl;
        close(epoll_fd);
        return 1;
    }

    while (true) {
        // 等待事件发生
        event_count = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
        if (event_count == -1) {
            std::cerr << "Failed to wait for events." << std::endl;
            close(epoll_fd);
            return 1;
        }

        // 处理所有发生的事件
        for (int i = 0; i < event_count; ++i) {
            // 如果是标准输入可读事件
            if (events[i].data.fd == STDIN_FILENO) {
                // 读取用户输入
                int read_count = read(STDIN_FILENO, buffer, MAX_BUF_SIZE);
                if (read_count == -1) {
                    std::cerr << "Failed to read from standard input." << std::endl;
                    close(epoll_fd);
                    return 1;
                }
                // 将读取到的内容打印出来
                std::cout << "Read from standard input: " << buffer << std::endl;
            }
        }
    }

    // 关闭epoll句柄
    close(epoll_fd);
    return 0;
}

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

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

相关文章

SpringCloudAlibaba之Ribbon

Ribbon是nacos自带的负载均衡器&#xff0c;属于客户端的负载均衡 但是在Spring高级版本中让LoadBalancer替代了 本人用的是2.1.0的nacos&#xff0c;ribbon还没有被替换。 使用&#xff1a; 在配置类中&#xff1a;LoadBalanced BeanLoadBalancedpublic RestTemplate restT…

ETHERNET/IP转RS485/RS232网关什么是EtherNet/IP?

网络数据传输遇到的协议不同、数据互通麻烦等问题&#xff0c;一直困扰着大家。然而&#xff0c;现在有一种神器——捷米JM-EIP-RS485/232&#xff0c;它将ETHERNET/IP网络和RS485/RS232总线连接在一起&#xff0c;让数据传输更加便捷高效。 那么&#xff0c;它是如何实现这一功…

Python Web开发技巧VIII

目录 ModelSerializer和Serializer区别是什么 从queryset中取出某个models的字段值 Q对象进行模糊匹配 HTTP方式-如何模糊搜索JSON字段中的某个KEY值呢&#xff1f; showmigrations 合并两个或多个queryset ModelSerializer和Serializer区别是什么 都是DRF中用于序列化和…

尚医通9:医院列表功能+GateWay网关

内容介绍 1、医院列表功能&#xff08;接口&#xff09; 4、医院列表功能&#xff08;前端&#xff09; 5、更新医院上线状态功能 6、医院详情 7、GateWay网关 8、医院排班管理需求分析 9、查看医院所有科室接口、前端 医院列表功能&#xff08;接口&#xff09; 接口…

代码随想录算法训练营day15 | 102. 二叉树的层序遍历,226. 翻转二叉树,101. 对称二叉树

目录 102. 二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树 100. 相同的树 100是101的衍生题目。572也为101的衍生题目。 102. 二叉树的层序遍历 思路&#xff1a; 以前的笔记 代码&#xff1a; class Solution {public List<List<Integer>> levelOrder(T…

web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…

Reinforcement Learning with Code 【Chapter 9. Policy Gradient Methods】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…

C++之实例化对象总结(一百七十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

13 亿美金买个寂寞?No!AI 时代的数据行业蓄势待发

6月底&#xff0c;全球数据分析领域彻底炸锅了。 两大数据分析企业Databricks和Snowflake纷纷将目光瞄准了AI大模型。要知道&#xff0c;这两位对手平时没少对台戏&#xff0c;为性能、产品和技术经常开撕。但在今年的自家大会上&#xff0c;两家企业却出奇的一致&#xff0c;…

opencv+ffmpeg环境(ubuntu)搭建全面详解

一.先讲讲opencv和ffmpeg之间的关系 1.1它们之间的联系 我们知道opencv主要是用来做图像处理的&#xff0c;但也包含视频解码的功能&#xff0c;而在视频解码部分的功能opencv是使用了ffmpeg。所以它们都是可以处理图像和视频的编解码&#xff0c;我个人感觉两个的侧重点不一…

【博客684】Multi-regional高可用模式部署VictoriaMetrics

Multi-regional模式部署VictoriaMetrics 整体架构图 每个工作负载区域&#xff08;地球、火星、金星&#xff09;都有一个 vmagent&#xff0c;通过监控设置将数据发送到多个区域。监控设置&#xff08;地面控制 1,2&#xff09;包含 VictoriaMetrics 时间序列数据库 (TSDB) 集…

四姑娘山三日游

趁着小孩放暑假&#xff0c;从昆明回来之后&#xff0c;直接自驾到四姑娘山。 第一天 成都-四川省阿坝藏族羌族自治州小金县日隆镇(20230711) 大概9:30从成都市郫都区出发&#xff0c;路线如下&#xff1a;郫都—都江堰–映秀—耿达—卧龙—四姑娘山&#xff0c;中途翻过巴朗…

Notepad++工具通过正则表达式批量替换内容

1.每行末尾新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入$&#xff0c;替换为输入特定字符串&#xff1b;选中循环查找&#xff0c;查找模式选正则表达式&#xff1b;最后点击全部替换 2.每行行首新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入^&…

会议OA之我的会议(会议排座送审)

目录 前言&#xff1a; 2.我的会议&#xff1a; 2.1实现的特色功能&#xff1a; 2.2思路&#xff1a; 2.3功能实现&#xff1a; 我的会议页面&#xff1a;myMeeting.jsp myMeeting.js Dao方法 在mvc中配置info信息 Meeting InfoAction 2.4会议排座的思路&#xff1a; …

第四代SHARC® ADSP-21479KBCZ-2A、ADSP-21479BSWZ-2A、ADSP-21479KSWZ-2A高性能DSP(数字信号处理器)

第四代SHARC Processors 现在内置低功耗浮点DSP产品&#xff08;ADSP-21478和ADSP-21479&#xff09;&#xff0c;可提供改进的性能、基于硬件的滤波器加速器、面向音频与应用的外设以及能够支持单芯片解决方案的新型存储器配置。所有器件都彼此引脚兼容&#xff0c;而且与以往…

【Android知识笔记】UI体系(二)

什么是UI线程? 常说的UI线程到底是哪个线程?UI线程一定是主线程吗? 下面先给出两条确定的结论: UI线程就是刷新UI所在的线程UI是单线程刷新的关于第二条为什么UI只能是单线程刷新的呢?道理很简单,因为多线程访问的话需要加锁,太卡,所以一般系统的UI框架都是采用单线程…

《重构的时机和方法》,值得程序员仔细研读的一本书

现有代码结构及框架沿用的比较久&#xff0c;持续在其上新增功能&#xff0c;可维护性与可扩展性变得越来越差&#xff0c;随着需求不断增加&#xff0c;现有代码变得越来越臃肿复杂&#xff0c;变得很难维护&#xff0c;甚至出现较严重的性能瓶颈&#xff0c;一般这个时候我们…

Thymeleaf入门

Thymeleaf是前端开发模板&#xff0c;springboot默认支持。前端模板用法大多数是类似的jsp、thymeleaf、vue.js都有while\for\if\switch等使用&#xff0c;页面组件化等。 1.前端模板区别 jsp是前后端完全不分离的&#xff0c;jsp页面写一堆Java逻辑。 thymeleaf好处是html改…

域名解析优先级

浏览器访问过程解析 访问网址——>首先在本地电脑看看hosts里面是否有域名对应IP地址&#xff0c;如何有直接访问对应IP&#xff0c; 如果没有&#xff0c;则联网询问DNS服务器&#xff08;一般网卡那边都配置了DNS服务器IP&#xff09; linux hosts 路径&#xff1a; w…

苍穹外卖-day07

苍穹外卖-day07 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…