和luster學習在Linux建立庫函式(6)(轉)
和luster學習在Linux建立庫函式(6)(轉)[@more@]4.3. dlsym()
如果你載入了一個DL函式庫而不去使用當然是不可能的了,使用一個DL函式庫的最主要的一個函式就是dlsym(),這個函式在一個已經開啟的函式庫裡面查詢給定的符號。這個函式如下定義:
void * dlsym(void *handle, char *symbol);
函式中的引數handle就是由dlopen開啟後返回的控制程式碼,symbol是一個以NIL結尾的字串。
如果dlsym()函式沒有找到需要查詢的symbol,則返回NULL。如果你知道某個symbol的值不可能是NULL或者0,那麼就很好,你就可以根據這個返回結果判斷查詢的symbol是否存在了;不過,如果某個symbol的值就是NULL,那麼這個判斷就有問題了。標準的判斷方法是先呼叫dlerror(),清除以前可能存在的錯誤,然後呼叫dlsym()來訪問一個symbol,然後再呼叫dlerror()來判斷是否出現了錯誤。一個典型的過程如下:
dlerror(); /* clear error code */
s = (actual_type) dlsym(handle, symbol_being_searched_for);
if ((err = dlerror()) != NULL)
{
/* handle error, the symbol wasn't found */
}
else
{
/* symbol found, its value is in s */
}
4.4. dlclose()
dlopen()函式的反過程就是dlclose()函式,dlclose()函式用力關閉一個DL函式庫。Dl函式庫維持一個資源利用的計數器,當呼叫dlclose的時候,就把這個計數器的計數減一,如果計數器為0,則真正的釋放掉。真正釋放的時候,如果函式庫裡面有_fini()這個函式,則自動呼叫_fini()這個函式,做一些必要的處理。Dlclose()返回0表示成功,其他非0值表示錯誤。
4.5. DL Library Example
下面是一個例子。例子中調入math函式庫,然後列印2.0的餘弦函式值。例子中每次都檢查是否出錯。應該是個不錯的範例:
#include
#include
#include
int main(int argc, char **argv)
{
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL)
{
fputs(error, stderr);
exit(1);
}
printf ("%f ", (*cosine)(2.0));
dlclose(handle);
}
如果這個程式名字叫foo.c,那麼用下面的命令來編譯:
gcc -o foo foo.c -ldl
(待續...)
by luster2001-8-21'
如果你載入了一個DL函式庫而不去使用當然是不可能的了,使用一個DL函式庫的最主要的一個函式就是dlsym(),這個函式在一個已經開啟的函式庫裡面查詢給定的符號。這個函式如下定義:
void * dlsym(void *handle, char *symbol);
函式中的引數handle就是由dlopen開啟後返回的控制程式碼,symbol是一個以NIL結尾的字串。
如果dlsym()函式沒有找到需要查詢的symbol,則返回NULL。如果你知道某個symbol的值不可能是NULL或者0,那麼就很好,你就可以根據這個返回結果判斷查詢的symbol是否存在了;不過,如果某個symbol的值就是NULL,那麼這個判斷就有問題了。標準的判斷方法是先呼叫dlerror(),清除以前可能存在的錯誤,然後呼叫dlsym()來訪問一個symbol,然後再呼叫dlerror()來判斷是否出現了錯誤。一個典型的過程如下:
dlerror(); /* clear error code */
s = (actual_type) dlsym(handle, symbol_being_searched_for);
if ((err = dlerror()) != NULL)
{
/* handle error, the symbol wasn't found */
}
else
{
/* symbol found, its value is in s */
}
4.4. dlclose()
dlopen()函式的反過程就是dlclose()函式,dlclose()函式用力關閉一個DL函式庫。Dl函式庫維持一個資源利用的計數器,當呼叫dlclose的時候,就把這個計數器的計數減一,如果計數器為0,則真正的釋放掉。真正釋放的時候,如果函式庫裡面有_fini()這個函式,則自動呼叫_fini()這個函式,做一些必要的處理。Dlclose()返回0表示成功,其他非0值表示錯誤。
4.5. DL Library Example
下面是一個例子。例子中調入math函式庫,然後列印2.0的餘弦函式值。例子中每次都檢查是否出錯。應該是個不錯的範例:
#include
#include
#include
int main(int argc, char **argv)
{
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL)
{
fputs(error, stderr);
exit(1);
}
printf ("%f ", (*cosine)(2.0));
dlclose(handle);
}
如果這個程式名字叫foo.c,那麼用下面的命令來編譯:
gcc -o foo foo.c -ldl
(待續...)
by luster
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-962555/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 和luster學習在Linux建立庫函式(4)(轉)Linux函式
- 和luster學習在Linux建立庫函式(2)(轉)Linux函式
- 和luster學習在Linux建立庫函式(1)(轉)Linux函式
- Oracle學習筆記(6)——函式Oracle筆記函式
- 我的MYSQL學習心得(6) : 函式MySql函式
- 6、ExportToGIF函式 (轉)Export函式
- 強化學習 6 ——價值函式逼近強化學習函式
- 透過例子學習Lua(6)--C/C++中用Lua函式(轉)C++函式
- ES6學習筆記(三)【函式,物件】筆記函式物件
- ES6深入學習(二)關於函式函式
- 輕鬆學習 JavaScript(6):JavaScript 箭頭函式JavaScript函式
- 在Linux中建立靜態庫和動態庫Linux
- 函式學習函式
- 【Mysql 學習】日期函式函式MySql函式
- ES6-Generator 函式 和 async 函式函式
- 字串函式庫的經典使用學習字串函式
- Js函式和物件學習體會JS函式物件
- mysql日期和時間函式學習MySql函式
- spark RDD的學習,filter函式的學習,split函式的學習SparkFilter函式
- GNU/linux的C函式庫介紹(轉)Linux函式
- 利用回撥函式和CSocket建立網路程式 (轉)函式
- MySQL函式學習(一)-----字串函式MySql函式字串
- 轉 Lua標準庫: table函式, 數學函式, 字串函式/格式化/配對,函式字串
- 物聯網學習教程—函式引數和函式的值函式
- 函式學習五函式
- 函式學習六函式
- 函式學習三函式
- 函式學習四函式
- 函式學習二函式
- 函式的學習函式
- 學習Rust 函式Rust函式
- 學習dump函式函式
- ORACLE函式學習Oracle函式
- FreeRTOS學習記錄--任務建立函式詳解函式
- c語言學習--time庫函式詳解C語言函式
- 輕鬆學習 JavaScript——第 6 部分:JavaScript 箭頭函式JavaScript函式
- linux庫函式升級權威經驗(轉)Linux函式
- Linux程式建立函式vfork簡介Linux函式