久久久久久久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热在线免费
|
午夜精品久久久久久久久久久久
|
国产精品久久国产精品
|
日韩最新网站
|