C语言之Linux内核回调函数写法(八十九)

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:在阅读内核源码时,发现内核代码写的回调函数竟然都没有任何的修饰,随即分享给大家。

2.回调函数介绍

  • 回调函数(Callback Function)是计算机编程中的一个常用概念,特别是在面向对象编程和函数式编程中。简单来说,回调函数是一种将函数作为参数传递给另一个函数,并在适当的时候执行该函数的机制。回调函数通常用于实现事件驱动编程、异步编程和装饰器模式等。
  • 回调函数的概念最早可以追溯到20世纪50年代的函数式编程语言。在函数式编程中,回调函数被广泛使用,因为它使得函数的组合变得容易。在1980年代,回调函数开始在面向对象编程语言中得到应用,特别是在设计模式中。
  • 回调函数的应用场景非常广泛。例如,在图形用户界面编程中,当用户执行某个操作(如点击按钮)时,相应的回调函数会被调用。在网络编程中,当网络请求完成时,回调函数会被用于处理响应数据。在并发编程中,回调函数可以用于处理异步操作的结果。
  • 回调函数有多种形式,以下是几种常见的回调函数类型:
  1. 函数指针回调:这是最简单的回调函数形式。在这种形式中,将函数的指针作为参数传递给另一个函数。例如,在C语言中,可以使用函数指针来实现回调。
  2. 对象方法回调:在这种形式中,将对象的方法作为参数传递给另一个函数。在面向对象编程语言中,如Java和C#,这种回调函数形式非常常见。
  3. 匿名函数回调:在一些语言中,可以使用匿名函数作为回调函数。例如,在JavaScript中,匿名函数经常被用作回调函数。
  4. lambda表达式回调:在一些函数式编程语言中,如Scala和Java 8及以上版本,可以使用lambda表达式来创建回调函数。
    回调函数有一些优点和缺点。优点包括:
  5. 灵活性:回调函数可以使代码更加灵活,因为它允许在运行时动态地选择和传递函数。
  6. 代码解耦:回调函数可以将逻辑分离到不同的模块中,从而降低代码之间的耦合度。
  7. 事件驱动编程:回调函数使得事件驱动编程变得容易实现,因为事件处理器可以作为回调函数来处理事件。
    然而,回调函数也有一些缺点:
  8. callback hell:当回调函数的数量和层次过多时,代码可能会变得难以维护和理解,这种情况被称为“callback hell”。
  9. 性能问题:过多的回调函数可能会导致性能问题,因为函数调用需要消耗时间和资源。
  10. 错误处理:回调函数中的错误处理可能比较困难,因为错误可能需要在多个层次上传递。
  • 总之,回调函数是一种非常有用的编程概念,它可以在多种场景下提高代码的灵活性和可维护性。然而,在使用回调函数时,需要注意避免“callback hell”和性能问题,并妥善处理错误。

3.Linux内核代码使用回调函数实例

static int do_dentry_open(struct file *f,
			  struct inode *inode,
			  int (*open)(struct inode *, struct file *))
{
	static const struct file_operations empty_fops = {};
	if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))
		f->f_mode |= FMODE_ATOMIC_POS;

	/* normally all 3 are set; ->open() can clear them if needed */
	f->f_mode |= FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE;
	if (!open)
		open = f->f_op->open;
	if (open) {
		error = open(inode, f);
	}
	return error;
}

do_dentry_open函数的第三个参数就是一个回调函数定义,然后使用open(inode, f)传入参数调用。

便于大家理解,下面写一个类似的Linux内核回调函数的用法实例。

4.代码实例

<1>.v1.0

#include <iostream>
#include <string>
#include <string_view>

using namespace std;
//定义finish_open函数,接受一个函数指针作为参数
void finish(int (*open)(string name, int mode)) {
  //调用回调函数
  open("/dev/binder", 777);
}

int open_file(string name, int mode) {
  printf("xxx--------------->line = %d, name = %s, mode = %d\n",__LINE__,name.c_str(),mode);
  return 0;
}

int main() {
  finish(open_file);
  return 0;
}

打印
xxx--------------->line = 13, name = /dev/binder, mode = 777

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

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

相关文章

论文阅读,Accelerating the Lattice Boltzmann Method(五)

目录 一、Article:文献出处&#xff08;方便再次搜索&#xff09; &#xff08;1&#xff09;作者 &#xff08;2&#xff09;文献题目 &#xff08;3&#xff09;文献时间 &#xff08;4&#xff09;引用 二、Data:文献数据&#xff08;总结归纳&#xff0c;方便理解&am…

Nginx的反向代理

Nginx的反向代理 location ^~ /aaa {proxy_pass http://192.168.15.78/; } 1. 跨域 2.Nginx 代理服务器缓存 3.Nginx 负载均衡 4. 动静分离 Nginx的跨域 跨源资源共享 (CORS) 是一种机制&#xff0c;它使用额外的 HTTP 标头让用户代理获得访问来自不同来域的服务器上选定资…

LongAdder 和 AtomicLong

有幸看到一篇关于这个讲解 2个类的讲解&#xff0c;自己也归纳总结一下。 一、解析 看源码底层会发现实现机制不一样&#xff0c;当然这个也是必须的 LongAdder 点进去之后会发现&#xff0c;CAS 它是一个CAS的实现类。至于Cell类JVM提供的内置函数 官方说法是&#xff1a;…

Python版【植物大战僵尸 +源码】

文章目录 写在前面&#xff1a;功能实现环境要求怎么玩个性化定义项目演示&#xff1a;源码分享Map地图:Menubar.py主菜单 主函数&#xff1a;项目开源地址 写在前面&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是…

小程序开发调试指南

调试指南 一、Vconsole 一些线上问题需要在真机中进行调试或日志输出&#xff0c;为方便查看前端日志的输出&#xff0c;App 端提供了调试模式, 打开调试模式后面板界面中会显示 vConsole 按钮&#xff0c;点击后可打开手机端 vConsole界面查看日志输出。 1.如何开启 点击小…

JumpServer 堡垒主机

JumpServer 堡垒机帮助企业以更安全的方式管控和登陆各种类型的资产 SSH&#xff1a;Linux/Unix/网络设备等Windows&#xff1a;Web方式连接/原生RDP连接数据库&#xff1a;MySQL、Oracle、SQLServer、PostgreSQL等Kubernetes&#xff1a;连接到K8s集群中的PodsWeb站点&#x…

复现黄金票据

一、搭建环境 搭建域环境可以点击这个查看步骤 在这里面monowall的配置查看 二、实验步骤 拿到域名 拿到SID 使用mimikatz拿到krbtgt用户的哈希 删除票据 也可以使用mimikatz.exe删除票据&#xff0c;命令是kerberos::purge 伪造票据 拿到域控 伪造成功

物联网实战--入门篇之(六)嵌入式-WIFI驱动(ESP8266)

目录 一、WIFI简介 二、基础网络知识 三、思路讲解 四、代码分析 4.1 状态机制 4.2 客户端连接 4.3 应用数据接收处理 4.4 数据发送 4.5 主函数调用 4.6 网络连接ID分配 五、总结 一、WIFI简介 WIFI在我们生活中太常见了&#xff0c;手机电脑都可以用WiFi连接路由器进行上…

MySQL核心命令详解与实战,一文掌握MySQL使用

文章目录 文章简介演示库表创建数据库表选择数据库删除数据库创建表删除表向表中插入数据更新数据删除数据查询数据WHERE 操作符聚合函数LIKE 子句分组 GROUP BY HAVINGORDER BY(排序) 语句LIMIT 操作符 分页查询多表查询-联合查询 UNION 操作符多表查询-连接的使用-JOIN语句编…

从0到1手把手撸码搭建后台管理系统

从0到1手把手撸码搭建后台管理系统 第一章:系统介绍开发目的与过程 要使用 Vue3 搭建后台&#xff0c;你可以按照以下步骤进行&#xff1a; 安装 Vue3&#xff1a;使用包管理工具&#xff08;如 npm 或 yarn&#xff09;安装 Vue3。选择构建工具&#xff1a;选择一个适合的构…

Spring之循环依赖

什么是循环依赖? 依赖的相互引用,如下列的这种形式 Component public class A {Autowiredprivate B b;}Component public class B {Autowiredprivate A a; } Spring是如何解决循环依赖的 Spring是通过三级缓存来解决循环依赖 singletonObjects : 单例bean,已经实例化,完成…

非周期连续函数的傅里叶变换

首先 我们把一个非周期信号扩展成一个周期信号 然后用傅里叶级数展开 也可以得到对应的级数系数 利用周期趋向于无穷大 可以把傅里叶级数展开就变成了一个积分 而神奇的是积分里其实还有一个积分 这样我们就得到了傅里叶变换对 我们把里面的积分成为函数的傅里叶变换 把外面…

C语言交换二进制位的奇数偶数位

基本思路 我们要先把想要交换的数的二进制位给写出来假如交换13的二进制位&#xff0c;13的二进制位是 0000 0000 0000 0000 0000 0000 0000 1101然后写出偶数位的二进制数&#xff08;偶数位是1的&#xff09; 1010 1010 1010 1010 1010 1010 1010 1010然后写出奇数位的二进…

Mac通过Idea启动Tomcat时出现Cannot run program xxx/catalina.sh 错误

问题描述 Mac通过Idea启动Tomcat时出现Cannot run program xxx/catalina.sh错误&#xff0c;详细如下&#xff1a; Error running Tomcat9 Cannot run program "/Users/xxx/Desktop/work/devtools/apache-tomcat-9.0.19/bin/catalina.sh" (in directory "/U…

算法设计课第一周(排序算法的效率分析)

实验1 排序算法的效率分析 一、【实验目的】 &#xff08;1&#xff09;复习排序算法的实现过程&#xff1b; &#xff08;2&#xff09;设计平均与最坏情况下时间复杂度的数据环境并理解相关含义&#xff1b; &#xff08;3&#xff09;初步了解算法时间复杂度的分析方法。…

FlashFace:一种高保真身份保存的人类形象个性化方法

FlashFace技术是由香港大学、阿里巴巴集团、蚂蚁集团共同研发的一项实用工具&#xff0c;用户可以通过提供一张或几张参考面部图像和文本提示&#xff0c;就可以轻松地即时个性化自己的相片。 与现有的人像定制方法相比&#xff0c;FlashFace方法具有更高保真度的身份保留xi性…

【spring】Spring Cloud Alibaba版本发布说明

Spring Cloud Alibaba版本发布说明 由于 Spring Boot 3.0&#xff0c;Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大&#xff0c;目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下&#xff0c;为了同时满足存量用户和新用户不同需求&#xff0c;社…

Vue 组件化编程

Vue 组件化编程 非单文件组件 定义组件 使用Vue.extend(options&#xff09;创建 不要写eldata要写成函数&#xff0c;避免组件被复用时&#xff0c;数据存在引用关系 注册组件 局部注册&#xff1a;new Vue()的时候&#xff0c;options传入components全局注册&#xff1a;V…

Linux 个人笔记之三剑客 grep sed awk

文章目录 零、预一、grep 文本过滤工具基础篇实战篇 二、sed 字符流编辑器基础篇实战篇 三、awk 文本处理工具基础篇实战篇 四、附xargsuniq & sort基础篇实战篇 cut 零、预 bash 的命令行展开 {} $ echo file_{1..4} file_1 file_2 file_3 file_4$ echo file_{a..d} file_…

高等数学基础篇(数二)之多元函数的基本概念

多元函数基本概念&#xff1a; 一、多元函数的极限 二、多元函数的连续性 三、偏导数 四、全微分 目录 一、多元函数的极限 二、多元函数的连续性 三、偏导数 1.偏导数的定义 2.二元函数偏导数的几何意义 3.高阶偏导数 四、全微分 补充&#xff1a; 一元函数极限连…