加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于dlopen()加载动态库的问题

(2012-02-24 17:43:02)
标签:

dlopen

动态库

it

分类: 计算机

关于dlopen()加载动态库的问题
每次更新so的时候,主程序都需要重新起动,为什么需要重新起动了。原来是使用dlopen()来加载动态库的。
关于dlopen()加载的时候,如果更新了so但不重新调用dlopen()加载的话,那么主程序执行动态库里面的代码还是按旧的代码来执行,为了测试这个我进行了如下的测试:

一、主程序首次加载dlopen()动态库,然后循环调用动态库里面的函数
二、主程序循环里面调用dlopen()加载动态库,再执行库里面的函数

这两个测试过程中,主程序不重新起动,只更新so动态库文件。


代码如下:
主程序代码
//m.cpp
     1  #include <stdio.h>
     2  #include <unistd.h>
     3  #include <dlfcn.h>
     4  #include <iostream>
     5  using namespace std;
     6
     7  int main(int argc, char **argv) {
     8  ///int i = 1;
     9  //while(true){
    10          void *handle;
    11          int (*pa)();
    12          char *error;
    13
    14          handle = dlopen ("./so_t.so", RTLD_NOW);
    15          if (!handle) {
    16          fprintf (stderr, "%s\n", dlerror());
    17          return 0;
    18          }
    19
    20          dlerror();    
    21          *(void**)(&pa) = dlsym(handle,"so_test");
    22          if ((error = dlerror()) != NULL)  {
    23          fprintf (stderr, "%s\n", error);
    24          return 0;
    25          }
    26
    27          int i=1;
    28          while(true){
    29          cout<<i<<"---------"<<endl;
    30          pa();
    31          i++;
    32          sleep(2);
    33          }
    34          dlclose(handle);
    35  //}
    36          return 0;
    37  }

//so_test.cpp
     1
     2  #include <stdint.h>
     3  #include <iostream>
     4  #include <string>
     5
     6  using namespace std;
     7
     8
     9
    10  class a
    11  {
    12  public:
    13  a(){}
    14  ~a(){}
    15  public:
    16          int a_test(){cout<<"a_test 1"<<endl;
    17          cout<<"test 222"<<endl;cout<<"test 333"<<endl;return 0;}
    18
    19  };
    20
    21  //class a;
    22  extern "C"{
    23  int so_test()
    24  {
    25          cout<<"abcde"<<endl;
    26          cout<<"test so reload"<<endl;
    27  cout<<"test 2"<<endl;
    28  cout<<"test 3"<<endl;
    29          a *  pa = new a();
    30          pa->a_test();
    31          delete pa;
    32          return 0;
    33  }
    34  }


分别编译:
主程序
g++ -o m m.cpp -ldl
so动态库:
g++ -Wall -shared -fPIC -o so_test.so so_t.cpp


经测试结果:dlopen()的加载情况
1、如果dlopen()加载一次,后续直接使用首次加载的函数,那么更新so动态库的时候,还是还原来的函数执行,不会执行更新后的逻辑
2、如果每次使用so动态库里面的函数的时候,都重新dlopen()加载动态库,那么当更新so动态库的时候,会执行新的so里面的逻辑

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有