为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接库的本质及如何加载进来,需要进一步学习,后续继续补充。如何将程序设计为插件形式,挖掘出主题和业务之间的关系,需要进一步去学习。
Linux提供了一套API来动态装载库。下面列出了这些API:
- dlopen:在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程。使用dlclose()来卸载打开的库。。- dlsym:的函数原型是void* dlsym(void* handle,const char* symbol),在打开的库中查找符号的值,handle是由dlopen打开动态链接库后返回的指针,symbol就是要求获取的函数的名称,函数返回值是void*,指向函数的地址,供调用使用。
- dlclose:dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
- dlerror,返回一个描述最后一次调用dlopen、dlsym,或dlclose的错误信息的字符串。
1.生成动态链接库文件.so文件,编译使用命令:
gcc -shared -o hello.so hello.c
hello.c
#include <stdio.h>
void hello(int *x,int y)
{
printf("x = %d,y = %d\n",*x,y);
}
2.采用上面生成的hello.so,写个测试程序如下:
gcc -o hello_dlopen hello_dlopen.c -ldl
#include <s