Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

和luster学习在Linux创建库函数(6)

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  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 luster

  2001-8-21'




 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:和luster学习在Linux创建库函数(5)   下一篇:和luster学习在Linux创建库函数(7)

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号