因为工作需要,需要做一个升级库,app调用升级库的接口,完成升级。大部分情况下,app需要实时知晓升级的进度。那么获取升级进度有2种方式:1、app主动掉库提供的升级进度接口。2、app向库里面注册一个回调函数,库实时调用回调函数来更新。
所谓的在库里面注册回调函数,其实就是app告诉库对应函数的函数指针,库拿到函数指针后,就可以调用对应的函数了。
代码结构如下:
.
├── func.c
├── func.h
├── main.c
└── make.sh
代码如下:
库代码:
func.c
#include <stdio.h>
#include "func.h"
//声明一个函数指针,用来保存app传递过来的函数指针
Func_call_back_pointer progess_call_back = NULL;
/*
* function:提供一个给app注册的函数。将app传递过来的函数指针保存到progess_call_back里面
* return:0-成功 非0-失败
* */
int regsiter_callback(Func_call_back_pointer callback)
{
if(callback == NULL)
{
return -1;
}
progess_call_back = callback;
return 0;
}
/*
* function:常规接口
* return:0-成功 非0-失败
* */
int func(void)
{
int i = 0;
for(i = 0; i < 10; i++)
{
progess_call_back(i); //因为是别人提供的函数,所以按理来说,我们无法判断返回值
}
return 0;
}
func.h
#ifndef _FUNC_H_
#define _FUNC_H_
/*
* 在头文件里面定义函数指针的类型 便于app和lib统一
*/
typedef int (*Func_call_back_pointer) (int Param);
/*
* function:提供一个给app注册的函数。将app传递过来的函数指针保存到progess_call_back里面
* return:0-成功 非0-失败
* */
int regsiter_callback(Func_call_back_pointer callback);
/*
* function:常规接口
* return:0-成功 非0-失败
* */
int func(void);
#endif
main.c
#include <stdio.h>
#include "func.h"
/*
* 这是我们需要注册的回调函数
*/
int get_progress(int value)
{
printf("progress:%d\n", value);
return 0;
}
int main(int argc, char *argv[])
{
//向库里面注册回调函数
regsiter_callback(get_progress);
//调用常规接口
func();
return 0;
}
make.sh
#!/bin/bash
#编译生成库
gcc -o libfunc.so func.c -shared -fPIC
#编译生成app
gcc -o test main.c -I./ -L./ -lfunc
#导入环境变量
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./
#执行app
./test
#清除所有非源码文件
rm libfunc.so test
对应的源码:在库里面实现注册函数回调-Linux文档类资源-CSDN下载
注:所有的源码已经在博客里面贴出来了。上传链接只是方便后续更新