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

简介: 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优化基于tcp,socket的ftp文件传输程序

原始程序&#xff1a; template_ftp_server_old.py&#xff1a; import socket import json import struct import os import time import pymysql.cursorssoc socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOST 192.168.31.111 PORT 4101 soc.bind((HOST,PORT)) p…

MVC与MVVM模式的区别

一、MVC Model&#xff08;模型&#xff09;&#xff1a;用于处理应用程序数据逻辑&#xff0c;负责在数据库中存取数据。处理数据的crud View&#xff08;视图&#xff09;&#xff1a;处理数据显示的部分。通常视图是依据模型数据创建的。 Controller&#xff08;控制器&…

25.6 matlab里面的10中优化方法介绍—— 遗传算法(matlab程序)

1.简述 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型&#xff0c;是一种通过模拟自然进化过程搜索最优解&#xff08;所找到的解是全局最优解&#xff09;的方法。 参数编码、初始群体的设定…

Generative Diffusion Prior for Unified Image Restoration and Enhancement 论文阅读笔记

这是CVPR2023的一篇用diffusion先验做图像修复和图像增强的论文 之前有一篇工作做了diffusion先验&#xff08;Bahjat Kawar, Michael Elad, Stefano Ermon, and Jiaming Song, “Denoising diffusion restoration models,” arXiv preprint arXiv:2201.11793, 2022. 2, 4, 6,…

【万字长文】SpringBoot整合SpringSecurity+JWT+Redis完整教程(提供Gitee源码)

前言&#xff1a;最近在学习SpringSecurity的过程中&#xff0c;参考了很多网上的教程&#xff0c;同时也参考了一些目前主流的开源框架&#xff0c;于是结合自己的思路写了一个SpringBoot整合SpringSecurityJWTRedis完整的项目&#xff0c;从0到1写完感觉还是收获到不少的&…

前端,js , Error in created hook: TypeError ,有bug了

怎么兄弟&#xff0c;遇到bug了&#xff1f;&#xff1f;&#xff1f;你开心吗&#xff0c;哈哈哈哈

论文笔记--Skip-Thought Vectors

论文笔记--Skip-Thought Vectors 1. 文章简介2. 文章概括3 文章重点技术3.1 Skip Thought Vectors3.2 词表拓展 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;Skip-Thought Vectors作者&#xff1a;Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Rich…

7.28 作业 QT

手动完成服务器的实现&#xff0c;并具体程序要注释清楚: widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //对话框类 #include …

乐划锁屏充分发挥强创新能力,打造内容业新生态

乐划锁屏作为新型内容媒体,在这一市场有着众多独特的优势,不仅能够通过多场景的联动给内容创作者带来了更多可能性,还促进了更多优质作品的诞生,为用户带来更加丰富多彩的锁屏使用体验。 作为OPPO系统原生的OS应用,乐划锁屏一直致力于打造为用户提供至美内容的内容平台,吸引了全…

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

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

解决 tensorflow 出现的 ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. 问题

在安装完tensorflow库后出现 问题详述&#xff1a; ImportError: Could not find the DLL(s) msvcp140_1.dll. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downlo…

FS32K144官方提供串口Bootloader对接Matlab串口烧写程序

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 前言 Bootloader升级工具&#xff1a;可用TTL、232、485&#xff08;硬件收发模式&#xff09;,其中的一种&#x…

K8s-资源管理(二)

文章目录 2. 资源管理2.1 资源管理介绍2.2 YAML语言介绍2.3 资源管理方式2.3.1 命令式对象管理2.3.2 命令式对象配置2.3.3 声明式对象配置 2.4. 模拟使用普通用户来操作2.5 kubectl 一些基本命令2.6 使用个人的 docker 仓库的镜像 2. 资源管理 2.1 资源管理介绍 在kubernetes…

JMM是如何保证原子性呢?

3.3.1加锁 锁是一种通用技术&#xff0c;比如Java提供的Synchronized关键字就是锁的一种实现&#xff0c;Synchronized是排他锁/独占锁&#xff0c;就是有你没我的意思&#xff0c;只要其他线程到来访问&#xff0c;发现锁还未释放&#xff0c;就要在外面等待&#xff0c;因为S…

linux系统下(centos7.9)安装Jenkins全流程

一、卸载历史版本 # rpm卸载 rpm -e jenkins# 检查是否卸载成功 rpm -ql jenkins# 彻底删除残留文件 find / -iname jenkins | xargs -n 1000 rm -rf二、环境依赖安装 yum -y install epel-releaseyum -y install daemonize三、安装Jenkins Jenkins官网传送带&#xff1a; …

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯&#xff0c;直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容&#xff0c;它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

微服务入门---SpringCloud(一)

微服务入门---SpringCloud&#xff08;一&#xff09; 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示例2.2.1.导入Sql语句2.2.2.导入demo工程 2.3.实现远程调用案例2.3.1.案例需求…

【Koa】[NoSQL] Koa中相关介绍和使用Redis MongoDB增删改查

目录 NoSQL非关系型数据库关系型数据库&#xff08;RMDB&#xff09;介绍非关系型数据库&#xff08;NoSQL&#xff09;介绍Redis & MongoDB 在 Koa 中使用 Redis (了解)Redis 的安装和使用在 Koa 中连接 和 调用 Redis 在 Koa 中使用 MongoDBMongoDB 的安装MongoShell 操作…

【Spring框架】SpringBoot配置文件

目录 配置文件作用application.properties中午乱码问题&#xff1a;配置文件里面的配置类型分类SpringBoot热部署properties基本语法properties配置文件的优缺点&#xff1a;yml配置文件说明yml基本语法配置对象properties VS yml 配置文件作用 整个项⽬中所有重要的数据都是在…

SQL-每日一题【1068. 产品销售分析 I】

题目 销售表 Sales&#xff1a; 产品表 Product&#xff1a; 写一条SQL 查询语句获取 Sales 表中所有产品对应的 产品名称 product_name 以及该产品的所有 售卖年份 year 和 价格 price 。 查询结果中的顺序无特定要求。 查询结果格式示例如下&#xff1a; 解题思路 1.题目要…