熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

在Linux創建庫函數(6)

2013-11-13 15:34:17  來源: Oracle 

   dlsym()
  
    如果你加載了一個DL函數庫而不去使用當然是不可能的了使用一個DL函數庫的最主要的一個函數就是dlsym()這個函數在一個已經打開的函數庫裡面查找給定的符號這個函數如下定義
  
   void * dlsym(void *handle char *symbol);
  
    函數中的參數handle就是由dlopen打開後返回的句柄symbol是一個以NIL結尾的字符串
  
    如果dlsym()函數沒有找到需要查找的symbol則返回NULL如果你知道某個symbol的值不可能是NULL或者那麼就很好你就可以根據這個返回結果判斷查找的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 wasnt found */
  }
  else
  {
   /* symbol found its value is in s */
  }
  
     dlclose()
  
    dlopen()函數的反過程就是dlclose()函數dlclose()函數用力關閉一個DL函數庫Dl函數庫維持一個資源利用的計數器當調用dlclose的時候就把這個計數器的計數減一如果計數器為則真正的釋放掉真正釋放的時候如果函數庫裡面有_fini()這個函數則自動調用_fini()這個函數做一些必要的處理Dlclose()返回表示成功其他非值表示錯誤
  
     DL Library Example
  
    下面是一個例子例子中調入math函數庫然後打印的余弦函數值例子中每次都檢查是否出錯應該是個不錯的范例
  
   #include
   #include
   #include
   int main(int argc char **argv)
   {
   void *handle;
   double (*cosine)(double);
   char *error;
   handle = dlopen (/lib/libmso RTLD_LAZY);
   if (!handle) {
   fputs (dlerror() stderr);
   exit();
   }
   cosine = dlsym(handle cos);
   if ((error = dlerror()) != NULL)
   {
   fputs(error stderr);
   exit();
   }
   printf (%f (*cosine)());
   dlclose(handle);
  }
  
    如果這個程序名字叫fooc那麼用下面的命令來編譯
  
   gcc o foo fooc ldl
  
    (待續)
  
    by luster
  

From:http://tw.wingwit.com/Article/program/Oracle/201311/16950.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.