Linux插件框架实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档