linux|C语言回调函数和钩子函数

【linux|C语言回调函数和钩子函数】这篇博文讲得挺清楚的:
钩子函数和回调函数的区别
总结一下,就是:回调函数更多的是目的处理,而钩子函数更多的是过程监控
个人感觉这两种函数的界限似乎并没有特别明显,我就遇到过回调函数和钩子函数的注册函数是同一个的情况、(回调函数没有作为调用函数参数传入),这两个的函数的区别,举个例子来说明一下我自己的理解吧:
比如有个libagent.so库提供了一个代理功能,可以用来跟服务端做交互,然后这个库的日志输出想统一输出到调用这个库的主程序的日志目录下,也就是说,日志打印这个功能最好由主函数来提供实现,这种情况下,主函数和库两方的开发人员只需要商量好日志打印函数的参数类型、数量,定义一个结构一致的函数指针,然后库开发人员声明一个该指针类型的函数变量并为该函数变量提供一个赋值接口,这样在需要输出日志的位置使用该变量即可,不需要实现函数功能,而主函数的开发人员需要实现日志输出函数,然后调用库提供的赋值接口,把这个函数传入即可完成赋值,这样libagent.so中的日志输出就使用的是主函数中的实现了,这样做有个好处是在保证函数指针不变的情况下,双方不需要协商函数名,可以任意取名,不同的调用者可以实现不同的日志输出函数,这种情况下的日志输出函数,就是一种回调函数——为实现某种特定目的函数
还是这个libagent.so接口,在处理消息的时候,主函数想对某些特定类型的消息进行特殊处理,这种情况下双方还是需要协商一个函数指针,用于处理该类型的消息,库函数中还是需要声明一个该函数指针类型的变量并提供一个给该函数指针变量赋值的接口,然后库函数在处理消息的时候进行判断,如果收到了指定类型的消息就调用该变量进行处理,主函数需要实现消息处理函数,并在agent消息处理流程启动前就调用赋值接口完成该函数的赋值,然后就等待收到指定类型的消息即可,这种情况下就是钩子函数——监听某种特殊情况的函数
这两种函数的区别,简单说,其实就是钩子函数不一定会用到,而回调函数一定会用到,因为钩子函数是要等待某种状态发生才会用到,这种状态不一定会发生,而回调函数是为了某个目的设置的,只要这个目的是必须的就一定会调用到

    推荐阅读