callback function

刚入职之时,小弟曾经受师兄指导写过一个回调,最近又回想到回调,思来想去,对回调的概念百思不得其解,困扰了好久。小弟愚钝,在查看了很多资料之后依然疑惑重重,犹如雾里看花终隔一层。如此两天,如骨在喉,实在是不吐不快。终于按奈不住心中躁动,拉起几位小伙伴深夜畅谈,终于拨开迷雾见明月。小弟谈谈自己的理解,希望对感兴趣的小伙帮能有所帮助;如果小弟有理解不妥的地方,更希望大家能帮忙指出,小弟万分感激。小弟在此拜谢了先~

  • callback function
  • example

callback function

官方解释

net 上有很多关于callback 的官方解释,小弟还是比较喜欢wiki上的解释。

In computer programming, a callback, also known as a “call-after” function, is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback. —— [ wiki]

这是wiki 上的原话,小弟就不献丑翻译了。

小弟的理解

下面是小弟的总结:

callback function 说白了其实就是: 一位管家提供了common的register interface 给callback 注册其function,等到caller在需要的时候调用这个interface。

如果你想知道这个管家 会是谁,其实这个时候可以说下,不要在意这些细节,但是小弟可以举例:如linux kernel/binder/server;如果你愿意,也可以是你自己创建的一个thread。 这里需要提到两个概念

  1. register interface;
  2. 函数指针;

register interface 当然最好是由管家提供,这样我们就不需要再用extern了。
当然callback function 的基础就是函数指针,所以我们得理解函数指针。当然关于函数指针,这个概念也是到处可以看到,为了让总结更加完善,小弟也就厚颜解释下了。

函数指针

先举出一个例子,pf就是函数指针,大家一看就明白了什么是函数指针。

int f(int);
int (*pf)(int) = &f;
int ans;
ans = f(25);
ans = (*pf)(25);
ans = pf(25);

example

callback 有synchronousasynchronous 两种情况。下面会针对这两种情况做一下举例。

synchronous

net上同步的列子不胜枚举,大部分情况下也都是以同步为例解释callback function。

#include <stdio.h>
#include <stdlib.h>/* The calling function takes a single callback as a parameter. */
void PrintTwoNumbers(int (*numberSource)(void)) {int val1 = numberSource();int val2 = numberSource();printf("%d and %d\n", val1, val2);
}/* A possible callback */
int overNineThousand(void) {return (rand()%1000) + 9001;
}/* Another possible callback. */
int meaningOfLife(void) {return 42;
}/* Here we call PrintTwoNumbers() with three different callbacks. */
int main(void) {PrintTwoNumbers(&rand);PrintTwoNumbers(&overNineThousand);PrintTwoNumbers(&meaningOfLife);return 0;
}

以上这段代码的执行结果如下:

1804289383 and 846930886
9778 and 9916
42 and 42

大家看到上面这段code 有何感想,可能会觉得这就是一个函数指针的应用而已,不过事实上,我就是这么认为。哈哈哈~ 小弟不才,只能看到这层,如果有哪位高手能看到更深的层次,还望不吝赐教,小弟感激不尽~

将上面这段代码稍作修改,就可以变成下面的样子:

#include <stdio.h>
#include <stdlib.h>struct callfunc {void (*p1)(void);void (*p2)(void);void (*p3)(void);
};/* A possible callback */
void currentRand(void) {printf("val is %d\n", rand()%100);
}/* A possible callback. */
void overNineThousand(void) {printf("val is %d\n", (rand()%1000) + 9001);
}/* A possible callback. */
void meaningOfLife(void) {printf("val is %d\n", 42);
}/* register callback function */
void register_func(struct callfunc *func) {func->p1 = overNineThousand;func->p2 = meaningOfLife;func->p3 = currentRand;
}/* Here we call three different callbacks. */
int main(void) {struct callfunc *f1 = (struct callfunc *)malloc(sizeof(callfunc));if (!f1) {return -1;printf("f1 is null\n");}register_func(f1);f1->p1();f1->p2();f1->p3();return 0;
}

执行结果如下:

val is 9384
val is 42
val is 86

很显然,这段code 与上一段并没有多大不同。但是仔细想想,如果有很多不同的module,都需要实现同一套功能,那么各自module 就可以分别调用注册函数,将自己的实体注册进来,这样caller就不需要为不同的module都写一套调用,caller 的函数就变的很简单,至于如何识别该用那一套,就不在callback 的考虑范畴之类了,当然如果大家感兴趣,可以给小弟留言。

asynchronous

说完了synchronous,接下来就该谈谈asynchronous。其实asynchronous是非常常见的,而且也是callback 应用的大部分场景。
仔细想想上一个code,这段code 其实在callback function注册的时候,并没有执行,而是等到某个时间点才开始执行,已经有一点异步的感觉了。
假设如果某一个callback function 被放到queue当中等待执行,caller 其实并没有等待callback function return 就直接返回了。这个就是比较明显的异步了。
异步的情况,kernel 里面可以说到处都可以看到,大家可以参考下kernel-4.4或者更新的版本,原生code 比较多,小弟就不再一一列举了。如果小伙伴比较感兴趣,可以留言给小弟,小弟会再想办法举例说明。

小结

希望此文对各位能有所帮助,如果小弟所述有不正确的地方,还请大家不吝赐教。如果有疑问的地方,也可以给小弟留言,小弟会知无不言言无不尽。
纸上得来终觉浅,绝知此事要躬行。与大家共勉。

目录

[TOC]来生成目录:

  • callback function

    • callback function

      • 官方解释
      • 小弟的理解
      • 函数指针
    • example
      • synchronous
      • asynchronous
    • 小结
      • 目录

Linux学习笔记之callback相关推荐

  1. linux rcs文件中的ip,linux学习笔记之diff和patch命令

    关键字:Linux 学习笔记 运维 系统 命令 一.命令的功能 diff命令的功能为逐行比较两个文本文件,列出其不同之处.可是做成diff记录也就是补丁. patch就是利用diff制作的补丁来打到文 ...

  2. (零)我为什么要写Linux学习笔记?

    我对Linux有强烈的好奇心,兴趣:写学习笔记会让我有成就感:我记忆力实在不好.好吧,其实真正原因是:如果我能把自己学到的知识简明扼要的讲出来,写出来,那便证明我真的学懂了我想学的知识.没时间怎么办? ...

  3. linux添加自己的库,Linux学习笔记——例叙makefile 增加自定义共享库

    Linux学习笔记--例说makefile 增加自定义共享库 0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己 ...

  4. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  5. Linux学习笔记(二)|常用命令

    Linux学习笔记(二)常用命令 1.文件处理命令 1.1命令格式与目录处理 -ls 功能描述:显示目录文件 原意:list 所在路径:/bin/ls 语法: ls-a 显示所有文件,包括隐藏文件 l ...

  6. Linux学习笔记(一)|目录结构

    Linux学习笔记(一) #一.Linux的目录结构 Linux采用层级式的树状目录结构,根目录为"/",在此目录下创建其他目录. /lib 系统开机所需要最基本的动态链接共享库 ...

  7. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  8. Linux学习笔记-文件权限与路径

    Linux学习笔记-文件与目录 目前从电子信息科学与技术转到了计算机专业,因此想趁着大四比较闲的时候补一些计算机的知识.我想说:你好,生活[斜眼笑]!愿生活温柔以待!哈哈,这是我写的第一篇博客,谨以此 ...

  9. LINUX学习笔记共五部分

    LINUX学习笔记1--LINUX系统命令 1.         界面切换: a)         进入字符界面:按住ctrl+alt+F1: 1.         首先需要进入用户登入,输入用户名和 ...

最新文章

  1. 收藏 | 深度学习损失函数大全
  2. class函数 python_python函数之classmethod()
  3. Golang内建库学习笔记(1)-sort和container
  4. php5.6.30环境报错Call to undefined function ImageCreate() 编译安装 gd库
  5. 数字三角形W(加强版) codevs 2189
  6. Qt中Ui名字空间以及setupUi函数的原理和实现
  7. mysql测试表格的年龄的语句是_MySQL查询语句练习题
  8. [转载]基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览
  9. WebSen!NT的行业分类说明
  10. js和jsp所有页面跳转总结
  11. ef 批量保存 oracle,mybatis-oracle与mysql批量添加
  12. vbs调用c++dll_COM编程攻略(八 动态调用与IDispatch接口)
  13. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 区别与使用场合
  14. Java 图片验证码的实现和模拟简单的登录
  15. 刷算法题必备的基础数论知识
  16. 进销存excel_简单易操作!Excel免费进销存管理系统!不花钱的进销存管理软件...
  17. UG数控编程显示和隐藏的快捷键
  18. “crol/cror”函数实现流水灯
  19. 狄拉克函数和广义函数 | 线性泛函
  20. 对日ODC与欧美ODC技术分析

热门文章

  1. vue 使用element 单选框 怎么同时获取value和label值
  2. 基于SpringBoot+微信小程序的社区平台
  3. 快速排序法 Java实现
  4. SwiftUI 网络请求组件之 使用Combin观察iOS应用程序网络连接状态(中文教程含视频源吗)
  5. 今天新拉取得项目启动报错:No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
  6. 用代码来理解MapReduce2_分组分区和combin优化
  7. Calendar类使用getActualMaximum方法天坑
  8. java实现无锁队列
  9. MYSQL之数据库设计范式和高级查询
  10. 用计算机打出下山这首歌,我要串词怎么引出下山这首歌?