c語言為了使程式方便擴充套件,具備通用性,可以採用外掛程式形式。採用非同步事件驅動模型,保證主程式邏輯不變,將各個業務已動態鏈結庫的形式載入進來,這就是所謂的外掛程式。linux提供了載入和處理動態鏈結庫的系統呼叫,非常方便。
dlopen函式以指定模式開啟指定的動態鏈結庫檔案,並返回乙個控制代碼給dlsym()的呼叫程序
dlclose 解除安裝開啟的庫
dlerror 返回出現的錯誤
dlsym dlsym通過控制代碼和連線符名稱獲取函式名或者變數名
int add(int a,int b)
intsub(int a, int b)
int mul(int a, int b)
int div(int a, int b)
編譯動態鏈結庫檔案
gcc -fpic -shared dl.c -o libdl.so
#include
#include
#include
#define lib_caculate_path "./libdl.so"
typedef int (*cac_func)(int, int);
int main()
dlerror();
*(void **) (&cac_func) = dlsym(handle, "add");
if ((error = dlerror()) != null)
printf("add: %d\n", (*cac_func)(2,7));
cac_func = (cac_func)dlsym(handle, "sub");
printf("sub: %d\n", cac_func(9,2));
cac_func = (cac_func)dlsym(handle, "mul");
printf("mul: %d\n", cac_func(3,2));
cac_func = (cac_func)dlsym(handle, "div");
printf("div: %d\n", cac_func(8,2));
dlclose(handle);
exit(exit_success);
}
編譯成可執行檔案 gcc -rdynamic -o opendl opendl.c -ldl
[root@jaytang dlopen]# ls
dl.c libdl.so opendl opendl.c
執行./opendl
出現如下效果
[root@jaytang dlopen]# ./opendl
add:
9sub:
7mul:
6div:
4
原始碼見github dlopen 和 dlsym 動態呼叫函式
dlopen 開啟乙個庫,獲取控制代碼。開啟so檔案獲取控制代碼 看作基位址 dlsym 在開啟的庫中查詢符號的值。so裡面查某個函式位址 dlclose 關閉控制代碼。dlerror 返回乙個描述最後一次呼叫dlopen dlsym,或 dlclose 的錯誤資訊的字串。import typede...
學習記錄 遞迴和堆疊
今天在學習遞迴和堆疊的知識 1 中,使用堆疊進行求和運算過程中遇到了 deque iterator not dereferencable 問題 include stdafx.h include include using namespace std 遞迴求和函式 int sum1 int value...
vi和vim學習記錄
學習的書為,鳥哥的linux私房菜第十章 裡面有張圖做出了很好的很直觀的解釋。開啟虛擬機器進行實際操作。首先看在一般模式下的主要常用操作。1 移動游標。a.可以使用反向鍵上下左右移動。c.數字0 或者 功能鍵 home 移動到這一行的最前面字元處 或者 end 移動到這一行的最後面的字元處。g移動到...