Linux环境下动态库调用回调函数是非常常见的。一般调用的访问mysql、sqlite及以一些数据库,都会调用对应数据库提供的动态库接口,这种方式特别方便,一直以来对于这种回调理解不是特别透,只是一味地调用,现在写篇博客简单的从自身的理解去诠释一下。
写一个简单动态库调用回调函数案例:
动态库代码test.c如下:
#include "test.h"
void (*ptrFun)(void *data);
void test_fun(void (*ptrFun)(void *data), void *data)
{
int i = 0;
for(i = 0; i < 3; i++)
{
ptrFun(data);
}
}
test.h如下:
#ifndef _TEST_H_
#define _TEST_H_
void test_fun(void (*ptrFun)(void *data), void *data);
#endif
生成动态库命令:
gcc -g -c test.c -o test.o
gcc -shared -fPIC -o libtest.so test.o
编写调用动态库实例代码main.c如下:
#include <stdio.h>
#include "test.h"
typedef struct{
int a;
char b;
}S_Test;
void myFun(void *pData)
{
S_Test *p_st = (S_Test *)pData;
printf("a : %d, b : %c\n", p_st->a, p_st->b);
}
int main()
{
S_Test s_st ;
s_st.a = 123;
s_st.b = 'h';
test_fun(myFun, &s_st);
return 0;
}
编译命令:
gcc -g -o main main.c -L./ -ltest
运行结果如下: