和luster學習在Linux建立庫函式(6)(轉)

subid發表於2007-08-16
和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'

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-962555/,如需轉載,請註明出處,否則將追究法律責任。

相關文章