当前位置: 首页 > news >正文

C++回调函数以及epoll中回调函数的使用

回调函数是一种常用的编程技术,它允许程序在运行时将一个函数作为参数传递给另一个函数,以实现更加灵活和可扩展的功能。在C++中,回调函数通常被实现为函数指针或者函数对象。

函数指针是指向函数的指针变量,可以通过它来调用函数。函数对象是一种可调用对象,它是一个类的对象,其中定义了一个operator()函数,可以像普通函数一样进行调用。下面是一个简单的回调函数示例,使用函数指针作为回调函数:

#include <iostream>// 定义回调函数类型
typedef void (*Callback)(int);// 回调函数
void my_callback(int x) {std::cout << "Callback function called with argument " << x << std::endl;
}// 接受回调函数作为参数的函数
void do_something(Callback callback) {// 执行某些操作int result = 42;// 调用回调函数callback(result);
}int main() {// 调用do_something函数,并传递回调函数my_callback作为参数do_something(my_callback);return 0;
}

在上面的示例中,我们定义了一个回调函数类型Callback,该类型是一个函数指针,接受一个int类型的参数并返回void。然后我们定义了一个my_callback函数,它接受一个int类型的参数,并打印出该参数的值。接着我们定义了一个do_something函数,它接受一个Callback类型的参数,并执行一些操作后调用该回调函数。

在主函数中,我们调用do_something函数,并传递my_callback函数作为参数。当do_something函数执行完成后,它会调用传递进来的回调函数my_callback,并将一个int类型的参数传递给它。

除了函数指针外,C++中还可以使用函数对象实现回调函数。下面是一个使用函数对象的回调函数示例:

#include <iostream>// 回调函数对象
class MyCallback {
public:void operator()(int x) const {std::cout << "Callback function called with argument " << x << std::endl;}
};// 接受回调函数对象作为参数的函数
void do_something(const MyCallback& callback) {// 执行某些操作int result = 42;// 调用回调函数对象callback(result);
}int main() {// 调用do_something函数,并传递回调函数对象MyCallback作为参数do_something(MyCallback());return 0;
}

在这个示例中,我们定义了一个回调函数对象MyCallback,它是一个类,其中定义了一个operator()函数,接受一个int类型的参数并返回void。我们还定义了一个do_something函数,它接受一个MyCallback类型的参数,并执行一些操作后调用该回调函数对象。

在主函数中,我们调用do_something函数,并传递MyCallback对象作为参数。当do_something函数执行完成后,它会调用传递进来的回调函数对象MyCallback,并将一个int类型的参数传递给它。

总的来说,回调函数是一种非常有用的编程技术,它可以使程序更加灵活和可扩展。通过将一个函数作为参数传递给另一个函数,我们可以在运行时动态地改变程序的行为。无论是使用函数指针还是函数对象,回调函数都是实现回调机制的常用方式。

epoll中回调函数的使用

epoll_wait函数会阻塞进程,直到有一个或多个文件描述符准备好进行读或写或者出现错误或超时。当epoll_wait返回时,程序需要通过遍历epoll_event数组来确定哪些文件描述符准备好进行读或写或者出现错误或超时,从而进行相应的处理。

在epoll_event结构体中,有一个data成员,它可以存储任意的用户数据。在epoll_wait函数中,我们可以将某个文件描述符关联的回调函数指针保存在data成员中。当epoll_wait函数返回并确定该文件描述符已准备好读或写时,程序会调用该回调函数来进行相应的处理。

以下是一个使用回调函数的epoll示例:

#include <sys/epoll.h>
#include <unistd.h>
#include <iostream>// 定义回调函数类型
typedef void (*Callback)(int);// 回调函数
void read_callback(int fd) {char buf[1024] = {0};int ret = read(fd, buf, sizeof(buf));if (ret > 0) {std::cout << "Read data from file descriptor " << fd << ": " << buf << std::endl;} else {std::cout << "Error reading data from file descriptor " << fd << std::endl;}
}// 添加文件描述符到epoll实例
void add_epoll(int epoll_fd, int fd, Callback callback) {epoll_event event;event.events = EPOLLIN;event.data.ptr = (void*)callback; // 保存回调函数指针到data成员epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event);
}int main() {int epoll_fd = epoll_create(10);int fd1 = STDIN_FILENO;int fd2 = STDOUT_FILENO;// 添加文件描述符到epoll实例add_epoll(epoll_fd, fd1, read_callback);add_epoll(epoll_fd, fd2, read_callback);// 监听文件描述符事件epoll_event events[10];while (true) {int n = epoll_wait(epoll_fd, events, sizeof(events)/sizeof(epoll_event), -1);for (int i = 0; i < n; i++) {Callback callback = (Callback)events[i].data.ptr; // 获取回调函数指针int fd = events[i].data.fd;callback(fd); // 调用回调函数进行处理}}return 0;
}

在这个示例中,我们定义了一个read_callback函数作为回调函数,用于读取文件描述符中的数据。我们还定义了一个add_epoll函数,它将一个文件描述符及其对应的回调函数添加到epoll实例中。在add_epoll函数中,我们将回调函数指针保存在epoll_event结构体的data.ptr成员中。在主函数中,我们使用epoll_wait函数监听文件描述符事件,并在事件触发时通过回调函数处理文件描述符中的数据。

需要注意的是,在使用回调函数时,必须保证回调函数的生命周期长于epoll_wait函数的调用。否则,在回调函数执行期间,可能会出现回调函数所引用的数据已经被销毁的情况,导致程序崩溃或产生其他不可预料的错误。

相关文章:

C++回调函数以及epoll中回调函数的使用

回调函数是一种常用的编程技术&#xff0c;它允许程序在运行时将一个函数作为参数传递给另一个函数&#xff0c;以实现更加灵活和可扩展的功能。在C中&#xff0c;回调函数通常被实现为函数指针或者函数对象。 函数指针是指向函数的指针变量&#xff0c;可以通过它来调用函数。…...

0基础学习软件测试有哪些建议

其实现在基础的资料和视频到处都是&#xff0c;就是看你有没有认真的去找学习资源了&#xff0c;去哪里学习都是要看你个人靠谱不靠谱&#xff0c;再好的教程和老师&#xff0c;你自己学习不进去也是白搭在正式选择之前&#xff0c;大可以在各种学习网站里面找找学习资源先自己…...

MySQL数据类型

文章目录一、数据类型分类二、数值类型1. tinyint 类型2. bit 类型3. int 类型4. float 类型5. decimal 类型三、字符串类型1. char 类型2. varchar 类型3. char 和 varchar 比较4.日期和时间类型5. enum 和 set一、数据类型分类 数据类型本质也是一种约束&#xff01; 如果插入…...

【设计模式】从Mybatis源码中学习到的10种设计模式

文章目录 一、前言二、源码&#xff1a;学设计模式三、类型&#xff1a;创建型模式1. 工厂模式2. 单例模式3. 建造者模式 四、类型&#xff1a;结构型模式1. 适配器模式2. 代理模式3. 组合模式4. 装饰器模式 五、类型&#xff1a;行为型模式1. 模板模式2. 策略模式3. 迭代器模式…...

爬虫攻守道 - 猿人学第20题 - 殊途同归

写在开头 这题也是&#xff0c;自己搞顶多追踪到wasm代码&#xff0c;然后就走不下去了。找了2个参考方案&#xff0c;自己做的过程中还又遇到些新的问题&#xff0c;下面做个记录。解法1参考文章解法2参考文章 解法1&#xff1a;追根溯源 在 JS 代码中追踪到 Payload 赋值位…...

4.11日报

synchronized 和 ReentrantLock 区别是什么&#xff1f; synchronized 早期的实现比较低效&#xff0c;对比 ReentrantLock&#xff0c;大多数场景性能都相差较大&#xff0c;但是在 Java 6 中对 synchronized 进行了非常多的改进。 主要区别如下&#xff1a; ReentrantLock …...

【LeetCode每日一题: 1039. 多边形三角剖分的最低得分 | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…...

Okio 网络提速

文章目录网络数据处理流程Page Cache传统 I/O 拷贝的性能问题零拷贝技术DMA 技术零拷贝技术分类mmapsendfilespliceDirect I/O零拷贝技术性能分析小结OkioOkio 的使用Okio 网络提速的原理Okio 总结总结网络数据处理流程 在讲 Okio 之前&#xff0c;为了能更好的了解 Okio 的优…...

自动驾驶企业面临哪些数据安全挑战?

近期&#xff0c;“特斯拉员工被曝私下分享用户隐私”不可避免地成了新闻热点&#xff0c;据说连马斯克也不能幸免。 据相关媒体报道&#xff0c;9名前特斯拉员工爆料在2019年至2022年期间&#xff0c;特斯拉员工通过内部消息系统私下分享了一些车主车载摄像头记录的隐私视频和…...

Doris(2):Doris编译部署

1 Doris编译 Apache Doris提供直接可以部署的版本压缩包&#xff1a;https://cloud.baidu.com/doc/PALO/s/Ikivhcwb5 也可以自行编译压缩包后使用&#xff08;推荐&#xff09; 1.1 使用 Docker 开发镜像编译&#xff08;推荐&#xff09; 这个是官方文档推荐的&#xff0c;…...

使用MyBatis实现简单查询

文章目录一&#xff0c;创建数据库与表&#xff08;一&#xff09;在Navicat里创建MySQL数据库testdb&#xff08;二&#xff09;创建用户表 - t_user&#xff08;三&#xff09;在用户表里插入3条记录二&#xff0c;案例演示MyBatis基本使用&#xff08;一&#xff09;创建Mav…...

C指针(*point)[4]和char *point[4]

char (*point)[4] // 数组指针。 a[3][4] // 先申明二维数组,用它来指向这个二维数组. char *point[4] // 指针数组。 a[4][5] // 一连串的指针. char (*point)[4] // 一个指针&#xff0c;指向有4个元素的数组&#xff1b;占内存大小为 4 个字节 ch…...

【Bard】谷歌的人工智能工具—Bard初体验

文章目录一、Bard介绍二、Bard体验1、加入Bard的候补名单2、登入Bard篇3、使用Bard篇&#xff08;1&#xff09;提供三种预选方式✨&#xff08;2&#xff09;创作生成各类文案&#xff08;3&#xff09;无生成图画能力&#xff08;4&#xff09;支持语音转文本输入✨&#xff…...

2022国赛30:windows脚本题解析

大赛试题内容: ( 九) ) 脚本 【任务描述】 为了减少重复性任务的工作量,节省人力和时间,请采用脚本,实现快速批量的操作。 1.在 windows4 上编写 C:\CreateFile.ps1 的 powershell 脚本,创建20 个文件 C:\test\File00.txt 至 C:\test\File19.txt,如果文件存在,则首先删除…...

Excel常用函数公式20例

目录 一、【IF函数条件判断】 二、【多条件判断】 三、【条件求和】 四、【多条件求和】 五、【条件计数】 六、【多条件计数】 七、【条件查找】 八、【多条件查找】 九、【计算文本算式】 十、【合并多个单元格内容】 十一、【合并带格式的单元格内容】 十二、…...

233:vue+openlayers绘制渐变填充色的圆形、多边形

第233个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中绘制带有渐变填充色的圆形、多边形。这里用canvas的方式去渲染,用到了DEVICE_PIXEL_RATIO,设备上的物理像素与设备无关像素 (dips) 之间的比率 (window.devicePixelRatio)。 直接复制下面的 vue+openlayer…...

Flink的窗口机制

窗口机制 tumble&#xff08;滚动窗口&#xff09; hop&#xff08;滑动窗口&#xff09; session&#xff08;会话窗口&#xff09; cumulate&#xff08;渐进式窗口&#xff09; Over&#xff08;聚合窗口&#xff09; 滚动窗口&#xff08;tumble&#xff09; 概念 滚…...

了解分布式Session

大家好&#xff0c;我这名CRUD工程师又来了&#xff0c;最近我的一个同事突然在看分布式Seesion的问题&#xff0c;然后我们两个也是互相讨论了一下&#xff0c;今天我就想着把分布式Session的知识点好好的梳理一下。 在很多系统中&#xff0c;用户的登录功能都是用Session去实…...

仿真创新大赛—国三省一 智能鱼缸(proteus)(stm32)

⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩去年下半年参加了全国仿真创新大赛&#xff0c;也是取得了国赛三等奖&#xff0c;省赛一等奖的好成绩。 ⏩本篇文章对我们的参赛作品《智能鱼缸》做一个简介。 ⏩感…...

【ARMv8 编程】A64 数据处理指令——位域字节操作指令

有些指令将字节、半字或字扩展到寄存器大小&#xff0c;可以是 X 或 W。这些指令存在于有符号&#xff08;SXTB、SXTH、SXTW&#xff09;和无符号&#xff08;UXTB、UXTH&#xff09;变体中&#xff0c;并且是适当的位域操作指令。 这些指令的有符号和无符号变体都将字节、半字…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...