Linux插件框架实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学
实验报告
学生姓名:学号:指导教师:
实验地点:A2-412 实验时间:2012.01.04
一、实验室名称:
Linux环境高级编程实验室
二、实验项目名称:
插件框架实验
三、实验学时:
4学时
四、实验目的:
学习和实践插件框架的开发。理解插件的工作原理,为进一步开发高可用,高复杂度的插件打下基础。
五、实验内容:
1、使用动态链接库实现打印功能:
开发一个程序,向屏幕打印“Hello World”;在不重新编译链接原程序的前提下,将打印的文字改为“Hello China”。
2、使用动态链接库实现自定义打印功能:
同时要打印“Hello World”,打印“Hello China”,甚至同时打印未来才会增加的其他打印信息,打印信息的链接库放在一个固定目录中,遍历这个目录,获取所有动态链接库。
打印未来的这些信息,也不能重新编译链接原程序。
3、
1)通过命令行方式:./a.out help,输出所有插件实现的功能ID,以及该功能ID对应的功能描述。
2)通过命令行方式:./a.out FuncID,调用具体打印功能(每个插件导出GetID接口)。
4、将插件导出的Print、GetID、Help三个函数放在一个类中,主程序需要使用多个容器分别保存这些函数地址,让插件外部获取该类的对象。
综合练习:实现一个软件系统,该系统可对文件进行统计分析。究竟对文件进行什么样的统计分析,最终用户自己也不是很清楚,目前只知道需要统计文件的行数。也就是说,本软件系统将会随时面临,增加文件统计新功能的难题。请结合本实验内容,设计并实现这样一个面向文件统计功能的插件系统。(需要实现的插件包括:统计某个文件的行数,统计某个文件的字节数)
六、实验步骤:
程序1:
A.h:
extern "c" void f();
a2.cpp:
#include
#include"a.h"
using namespace std;
void f()
{
cout << "hello,China!" << endl;
}
A1.cpp:
#include
#include"a.h"
using namespace std;
void f()
{
cout << "Hello,Word" << endl;
}
Main.cpp:
#include"a.h"
#include
#include
using namespace std;
int main()
{
void *handle = dlopen("./libtest.so", RTLD_LAZY);
if(0 == handle)
{
cout << "dlopen error" << endl;
return 0;
}
typedef void (*Fun)();
Fun f1 = (Fun)dlsym(handle, "f");
if(0 == f1)
{
cout << "f1 error" << endl;
char *str = dlerror();
cout << str << endl;
}
(*f1)();
dlclose(handle);
return 0;
}
程序运行结果如图1所示:
图1:字符的变换程序2:
A1.cpp:
#include
using namespace std;
extern"C" void f()
{
cout << "Hello world" << endl;
}
A2.cpp:
#include
using namespace std;
extern "C" void f()
{
cout << "Hello,china!" << endl;
}
A3.cpp:
#include
using namespace std;
extern "C" void f()
{
cout << "Hello 333" << endl;
}
A4.cpp:
#include
using namespace std;
extern "C" void f()
{
cout << "Hello 4444" << endl;
}
Test2.cpp:
#include
#include
#include
#include
#include
using namespace std;
int main()
{
char path[260];
DIR *dir;
struct dirent *ptr;
dir=opendir("/root/test/test4/plug2/plugin/");
while((ptr=readdir(dir))!=NULL)
{
if ((strcmp(ptr->d_name,"..")==0)||(strcmp(ptr->d_name,".")==0))
{
continue;
}
sprintf(path,"/root/test/test4/plug2/plugin/%s", ptr->d_name);
void *handle = dlopen(path, RTLD_LAZY);
if(0 == handle)