動態載入:
在程式中根據程式的需要,動態載入某個庫函式,這種行為稱為動態載入,系統為實現動態載入提供了一下函式:
man 3 dlopen顯示幫助:
標頭檔案:#include
void
*dlopen(const char *filename, int flag);
引數:filename:制定了動態庫的檔案名字
flag:
rtld_lazy:懶載入
rtld_now:立即載入
返回值:失敗的時候返回null,成功的時候返回乙個指標
char *dlerror(void);
功能:獲取dlopen,dlclose,slsym函式產生的錯誤
引數:無
返回值:返回乙個字串,這個字串描述了錯誤的原因
void
*dlsym(void
*handle, const char *symbol);
引數:handle:dlopen(3)的返回值,制定了要操作的庫函式
symbol:制定了要著的符號
int dlclose(void
*handle);
功能:將與handle相關的動態庫檔案的引用計數減1,庫檔案的引用計數減到0的時候,動態庫從記憶體中移除
引數:handle:制定了要關閉的動態庫,是dkopen(3)的返回值
返回值:非0代表錯誤,0代表成功
注意:link
with
-ldl
.//在gcc後面加上 -ldl
舉例說明:將libpmath.so動態庫載入到記憶體,並使用函式庫中的函式(dynamic.c)
#include
#include
typedef int (*func_t) (int,int);
int main(void)
printf("dlopen success...\n");
//在記憶體中查詢函式的入口位址
void
*f = dlsym(handle, "t_add");
if(f ==
null)
func_t p = (func_t)f; //func_t p = (int (*) (int,int))f 也可以
printf("3+2=%d\n", p(3,2));
//關閉動態庫
dlclose(handle);
return
0; }
測試dlopen,dlclose函式:
tarena@ubuntu:~/day/day25$ gcc dynamic.c -ldl
tarena@ubuntu:~/day/day25$ a.out
dlopen success...
測試dlerror函式:
tarena@ubuntu:~/day/day25$ a.out
libpath.so: cannot open shared object file: no such file or directory
測試dlsym函式:
tarena@ubuntu:~/day/day25$ gcc dynamic.c -ldl
tarena@ubuntu:~/day/day25$ a.out
dlopen success...3+
2=5
C語言 unix c 載入新的映像
使用新的映象替換舊的映象 載入新的影響使用execve 2 家族的函式 execve 2 include int execve const char filename,char const argv,char const envp 功能 執行程式 引數 filename 指定了要執行的程式 二進位制...
C語言 unix c 找到載入器的方法
找到載入器的方法 1 使用環境變數告訴載入器動態庫的搜尋路徑 export ld library path ld library path tmath 取出該變數的值,然後加上tmath後再賦值給變數 把動態庫檔案複製過去 舉例 tarena ubuntu day day24 tmath sudo ...
C語言 unix c 訊號基礎
二 訊號的基礎 1 什麼是訊號 訊號就是 軟中斷 軟中斷就是軟體模擬的中斷機制。2 中斷是什麼 正常的執行流程,訊號處理程式是兩條執行路線,但是屬於同乙個程序 3 系統為我們提供了哪些訊號?kill l 察看系統的中斷 64個訊號,32,33沒有 tarena ubuntu kill l 1 sig...