一般用於實現外掛程式功能,可通過呼叫函式來載入、解除安裝共享庫。可以查詢共享庫中函式名、變數名所對應的指標。
# include
void *dlopen(const
char *libfilename, int flags); //開啟共享庫
int dlclose(void *handle); //關閉共享庫
const
char *dlerror(void); //返回錯誤字串
void *dlsym(void *handle, char *symbol); //查詢共享庫中的符號
void *dlopen(const
char *libfilename, int flags);
rtld_global:這個共享庫中解析的函式符號可以被後面開啟的庫使用
rtld_local:這個共享庫中解析的函式符號不能被後面開啟的庫使用
注:以上兩個選項為共享庫的使用範圍
rtld_nodelete:不解除安裝共享庫,即使dlclose()後引用計數為0。此時,dlopen()不會重新初始化庫中靜態變數(glibc2.2可用)
rtld_noload:不載入共享庫,作用1:可用與測試共享庫是否被載入,如果載入返回共享庫控制代碼,不載入返回null。作用2:可再已開啟的共享庫上新增新的flags。(glibc2.2可用)
rtld_deepbind:解析庫中符號引用時,先搜尋庫中的定義,如果庫中沒有,再搜尋全域性定義。(這個很有用,可無腦加上,glibc2.3.4可用)
int dlclose(void *handle);
const
char *dlerror(void);
void *dlsym(void *handle, char *symbol);
void *handle:共享庫控制代碼
char *symbol:符號名稱(函式名、變數名)
root@jing-virtualbox
:~# ls
a.out libt.so main.c t.c
root@jing-virtualbox
:~# cat t.c #有點懶,並沒有寫t.c的標頭檔案。。。
# include
void f()
root@jing-virtualbox
:~# cat main.c
# include
# include
int main(void)
void (*f)() = dlsym(hander, "f");
f(); //呼叫函式f
dlclose(hander);
return0;}
root@jing-virtualbox
:~# gcc main.c -ldl
root@jing-virtualbox
:~# ./a.out
lib t
作用:確保聯結器只匯出指定符號。
gcc -shared a.o b.o c.o -o libabc.so -wl,--version-script,scriptfile.map
-wl,–version-script,scriptfile.map:指定乙個指令碼,規定可以匯出的符號,指令碼如下
global: # 可以被載入的符號
f_a;
f_b;
f_c;
local:
*; #*表示除global之外的所有符號
};
初始化函式會在共享庫載入的時候自動執行,終止函式會在共享庫解除安裝的時候自動執行,**如下。
void __attribute__ ((constructor)) 初始化函式名(void)
void __attribute__
((destructor)) 終止函式名(void)
注:以上均出自 linux/unix系統程式設計手冊,只選了感覺有用的。 資料庫高階特性
觸發器模板 create trigger trigger name trigger time trigger event on table name for each row trigger statementtrigger name 是觸發器的名字 trigger time 是觸發時間選項 bef...
資料庫的高階SQL特性
一 約束 1 唯一約束 唯一約束用來保證乙個列中的資料唯一,他們和主鍵的區別是 2 檢查約束 檢查約束用來保證乙個列中的資料滿足一組指定的條件,常見用途是 以下對order表施加了乙個檢查約束,保證所有物品的數量大於0 create table order 二 索引 資料庫表的主鍵總是排序的,我們可...
資料庫高階特性(索引)
索引的概念 索引是一種特殊的檔案,他們包含著對資料表裡面所有記錄的引用指標,它是對資料庫庫表中一列或多列的值進行排序的一種結構。簡單來說資料庫索引就是一本書前面的目錄,能夠加快對資料庫的查詢速度,資料庫索引就是為了提高表的搜尋效率而對某些欄位的值建立目錄。為什麼要建立索引?1 建立索引的目的就是加快...