久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 如何動(dòng)態(tài)加載.so文件 [打印本頁(yè)]

作者: 51黑tt    時(shí)間: 2016-3-5 19:57
標(biāo)題: 如何動(dòng)態(tài)加載.so文件
1:
libf1.so
#ifndef F1_HH_
#define F1_HH_
extern int func1(char *p);
#endif
#include <iostream>
using namespace std;
#ifdef __cplusplus
extern "C" {
#endif
int func1(char *p)
{
   if(p)
   {
        std::cout <<"func1: " ;
        std::cout <<p << endl;
   }
   return 1;
}
#ifdef __cplusplus
}
#endif
libf2.so
類似, 只是輸出不同
2: 編譯so
g++ f1.cpp -shared -fPIC -g -o libf1.so
g++ f2.cpp -shared -fPIC -g -o libf2.so
3: 應(yīng)用程序
注冊(cè)信號(hào)、動(dòng)態(tài)加載;收到信號(hào)后重新加載
幾個(gè)注意點(diǎn):
a)  so的編譯
b)  #ifdef __cplusplus ; 防止找不到符號(hào)。 so的編譯器與應(yīng)用程序的編譯器保持一致
c)  g++ -rdynamic -lf1 -g -o test main.cpp -ldl 編譯應(yīng)用程序。 -lf1的意思是動(dòng)態(tài)鏈接libf1.so     -ldl是為了使得可以動(dòng)態(tài)加載libf2.so
4)  應(yīng)用程序使用的so必需是通過符號(hào)鏈接到真實(shí)的so文件; 可以直接加載so,但是這種情況下so不能被修改(覆蓋),覆蓋時(shí)會(huì)程序core掉
view plaincopy to clipboardprint?
#include <stdio.h>   
#include <stdlib.h>   
#include <dlfcn.h>   
#include <signal.h>   
#include <iostream>   
#include <errno.h>   
#include "f1.h"   
  
int isreload = 0;   
  
void sig_show(int s)   
{   
    printf("catched signal: %d\n", s);   
    return;   
}   
  
void sig_reloadso(int s)   
{   
    printf("catched signal: %d\n", s);   
    isreload = 1;   
    printf("sigfunc isreload ? %d\n", isreload);   
    return;   
}   
  
int main(int argc, char *argv [])   
{   
    std::cout <<"main begin\n";   
  
    struct sigaction show;   
    show.sa_handler = &sig_show;   
    show.sa_flags = SA_NOMASK;   
    show.sa_restorer = 0;   
    if(sigaction(3, &show, 0) == -1)   
    {   
        printf("sigaction failed. errno: %d\n", errno);   
        return 0;   
    }   
  
  
    struct sigaction reload;   
    reload.sa_handler = &sig_reloadso;   
    reload.sa_flags = SA_NOMASK;   
    reload.sa_restorer = 0;   
    if(sigaction(4, &reload, 0) == -1)   
    {   
        printf("sigaction failed. errno: %d\n", errno);   
        return 0;   
    }   
  
  
    void *libf2;   
    int (*f2)(char *);   
  
    const static char * h = "hello";   
    char buf[200];   
  
    if((libf2 = dlopen("./libf2.so", RTLD_NOW | RTLD_GLOBAL)) != 0)   
    {   
        f2 = (int (*)(char *)) dlsym(libf2, "func2");   
        if(dlerror())   
        {   
            printf("error? %s\n", dlerror());   
        }   
    }   
    else  
    {   
        printf("can not open libf2.so\n");   
        return 0;   
    }   
  
    int i;   
  
    while(1)   
    {   
        printf("isreload ? %d\n", isreload);   
  
        if(isreload)    //test if need reload   
        {   
            dlclose(libf2);   
  
            if((libf2 = dlopen("./libf2.so", RTLD_LAZY | RTLD_GLOBAL)) != 0)   
            {   
                f2 = (int (*)(char *)) dlsym(libf2, "func2");   
                if(dlerror())   
                {   
                    printf("error? %s\n", dlerror());   
                    return 0;   
                }   
            }   
  
            isreload = 0;   
            printf("successfully reload libf2.so\n");   
        }   
  
        ++i;   
  
        sprintf(buf, "%s %d", h, i);      
  
        f2(buf);        //from f2   
  
        func1(buf);     //from f1   
  
        sleep(4);   
    }   
      
    return 0;   
}  







歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品一区av | 国产a久久麻豆入口 | 成人永久免费视频 | 日本少妇视频 | 亚洲精品网站在线观看 | 日韩欧美中文 | 免费在线播放av | 欧美日韩第一区 | 久草资源在线观看 | 午夜精品国产精品大乳美女 | 日韩在线观看一区 | 一级片免费 | 欧美视频亚洲视频 | 一本到| 黄色免费网站在线观看 | 日韩在线视频免费 | 亚洲区一区二 | 免费看黄色片子 | 亚洲综合网站 | 18国产免费视频动漫 | 特黄一级视频 | 日韩三级黄色片 | 色婷av| 一区二区精品在线 | www超碰| 欧美日韩在线一区二区 | 国产黄色av | 涩涩的动漫| 中日韩毛片 | 国产精品久久久久久久成人午夜 | av在线免费网站 | 欧美一区二区三区在线观看 | 国产精品三 | 欧美视频在线观看 | 日日干日日操 | 成人9ⅰ免费影视网站 | 极品白嫩少妇无套内谢 | 日韩精品久久久 | 欧美成人激情 | 8x8ⅹ国产精品一区二区 | 日韩视频第一页 |