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

標題: 如何動態(tài)加載.so文件 [打印本頁]

作者: 51黑tt    時間: 2016-3-5 19:57
標題: 如何動態(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: 應用程序
注冊信號、動態(tài)加載;收到信號后重新加載
幾個注意點:
a)  so的編譯
b)  #ifdef __cplusplus ; 防止找不到符號。 so的編譯器與應用程序的編譯器保持一致
c)  g++ -rdynamic -lf1 -g -o test main.cpp -ldl 編譯應用程序。 -lf1的意思是動態(tài)鏈接libf1.so     -ldl是為了使得可以動態(tài)加載libf2.so
4)  應用程序使用的so必需是通過符號鏈接到真實的so文件; 可以直接加載so,但是這種情況下so不能被修改(覆蓋),覆蓋時會程序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://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: av不卡一区 | 欧美伊人影院 | 狠狠涩| 亚洲激情综合 | 久久久亚洲一区 | 免费h视频 | 亚洲专区在线 | 日韩欧美手机在线 | a级片在线 | 国产激情免费视频 | 欧美成人一区二区 | 国产精品久久久久久久久久 | 日本不卡一区 | 久久免费精品视频 | 久久一 | 视频一区二区国产 | 麻豆久久久9性大片 | 久久999| 天天人人精品 | 亚洲成人av在线播放 | 国产一区久久精品 | 欧产日产国产精品视频 | 精品一区国产 | 伊人伊人| 精品久久久久久久人人人人传媒 | 91社区在线观看播放 | 午夜精品一区二区三区在线观看 | 91在线视频| 青青久草 | 亚洲在线免费观看 | 国产精品美女久久久久aⅴ国产馆 | 欧美成人一区二区三区 | 日韩在线免费播放 | 国产视频中文字幕 | 成人国产免费观看 | 亚洲精品天堂 | 久久国产精品精品国产色婷婷 | 99热在线免费 | 午夜精品久久久久久久久久久久 | 国产精品久久国产精品 | 日韩最新网站 |