Linux插件框架实验报告(共30页).doc
《Linux插件框架实验报告(共30页).doc》由会员分享,可在线阅读,更多相关《Linux插件框架实验报告(共30页).doc(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点:A2-412 实验时间:2012.01.04一、实验室名称:Linux环境高级编程实验室二、实验项目名称:插件框架实验三、实验学时:4学时四、实验目的:学习和实践插件框架的开发。理解插件的工作原理,为进一步开发高可用,高复杂度的插件打下基础。五、实验内容:1、使用动态链接库实现打印功能:开发一个程序,向屏幕打印“Hello World”;在不重新编译链接原程序的前提下,将打印的文字改为“Hello China”。2、使用动态链接库实现自定义打印功能:同时要打印“Hello World”,打印
2、“Hello China”,甚至同时打印未来才会增加的其他打印信息,打印信息的链接库放在一个固定目录中,遍历这个目录,获取所有动态链接库。打印未来的这些信息,也不能重新编译链接原程序。3、1)通过命令行方式:./a.out help,输出所有插件实现的功能ID,以及该功能ID对应的功能描述。2)通过命令行方式:./a.out FuncID,调用具体打印功能(每个插件导出GetID接口)。4、将插件导出的Print、GetID、Help三个函数放在一个类中,主程序需要使用多个容器分别保存这些函数地址,让插件外部获取该类的对象。综合练习:实现一个软件系统,该系统可对文件进行统计分析。究竟对文件进行
3、什么样的统计分析,最终用户自己也不是很清楚,目前只知道需要统计文件的行数。也就是说,本软件系统将会随时面临,增加文件统计新功能的难题。请结合本实验内容,设计并实现这样一个面向文件统计功能的插件系统。(需要实现的插件包括:统计某个文件的行数,统计某个文件的字节数)六、实验步骤:程序1:A. h:extern c void f();a2.cpp:#include#includea.husing namespace std;void f() cout hello,China! endl;A1.cpp:#include#includea.husing namespace std;void f() co
4、ut Hello,Word endl;Main.cpp:#includea.h#include#includeusing 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 e
5、ndl; (*f1)(); dlclose(handle); return 0;程序运行结果如图1所示:图1:字符的变换程序2:A1.cpp:#includeusing namespace std;externC void f()cout Hello world endl;A2.cpp:#includeusing namespace std;extern C void f() cout Hello,china! endl;A3.cpp:#includeusing namespace std;extern C void f()cout Hello 333 endl;A4.cpp:#include
6、using namespace std;extern C void f()cout Hello 4444 endl;Test2.cpp:#include#include#include#include#includeusing namespace std;int main()char path260;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,
7、.)=0)continue;sprintf(path,/root/test/test4/plug2/plugin/%s, ptr-d_name); void *handle = dlopen(path, RTLD_LAZY); if(0 = handle) cout dlopen error endl;return 0; typedef void (*Fun)(); Fun pf = (Fun)dlsym(handle, f); if(0 = pf) cout pf error endl; char *str = dlerror();cout str endl;return 0; (*pf)(
8、);dlclose(handle); closedir(dir);程序运行结果如图2所示:图2:插件的遍历程序3:a1.cpp:#include using namespace std;const int FUNC_ID = 1;extern C void f() cout Hello World! endl;extern C void Help() cout Function ID FUNC_ID : This function prints Hello World. endl;a2.cpp:#include using namespace std;const int FUNC_ID = 2
9、;extern C void f() cout Hello China! endl;extern C void Help() cout Function ID FUNC_ID This function prints hello china. endl;CPluginEnumerator.cpp#include CPluginEnumerator.h#include #include #include #include CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEn
10、umerator:GetPluginNames(vector& vstrPluginNames) DIR *dir = opendir(/root/test/test4/plug3/plugin); if(dir = 0)return false; for(;) struct dirent *ptr = readdir(dir);if(ptr = 0)break;if(strcmp(ptr-d_name, .) = 0)|(strcmp(ptr-d_name, .) = 0)continue;char path260;sprintf(path, /root/test/test4/plug3/p
11、lugin/%s, ptr-d_name);vstrPluginNames.push_back(path); closedir(dir);return true;Test.cpp:#include #include #include CPluginEnumerator.h#include #include using namespace std;int main(int argc, char *argv)char path 260; if(argc != 2)return 0; if(strcmp(argv1, help) = 0) vector vstrPluginNames; CPlugi
12、nEnumerator enumerator; if(!enumerator.GetPluginNames(vstrPluginNames) cout GetPluginNames error endl;return 0; for(int i = 0; i vstrPluginNames.size(); i+) void *handle = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY);if(handle = 0)cout dlopen error endl; return 0;typedef void (*FUNC_HELP)();FUNC_HELP
13、 dl_help = (FUNC_HELP)dlsym(handle, Help);if(dl_help = 0)cout dlsym error endl; return 0;(dl_help)();dlclose(handle);else if(strcmp(argv1, 1) = 0)sprintf(path, /root/test/test4/plug3/plugin/%s, a1.so);void *handle = dlopen(path, RTLD_LAZY);if(handle = 0)cout dlopen error endl;return 0;typedef void (
14、*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, f);if(dl_print = 0)cout dlsym error endl;return 0;(dl_print)();dlclose(handle);else if(strcmp(argv1, 2) = 0)/ 得到第二个func的参数sprintf(path, /root/test/test4/plug3/plugin/%s, a2.so);void *handle = dlopen(path, RTLD_LAZY);if(handle = 0)cout dl
15、open error endl;return 0;typedef void (*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, f);if(dl_print = 0)cout dlsym error endl;return 0;(dl_print)();dlclose(handle);return 0;程序运行结果如图3所示:图3:插件输出程序4:CPluginEnumerator.h:#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include #inc
16、lude using namespace std;class CPluginEnumeratorpublic: CPluginEnumerator(); virtual CPluginEnumerator(); bool GetPluginNames(vector& vstrPluginNames);#endifCPluginEnumerator.cpp:#include CPluginEnumerator.h#include #include CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()b
17、ool CPluginEnumerator:GetPluginNames(vector& vstrPluginNames) DIR *dir = opendir(./plugin); if(dir = 0)return false; for(;) struct dirent *pentry = readdir(dir);if(pentry = 0) break;if(strcmp(pentry-d_name, .) = 0) continue;if(strcmp(pentry-d_name, .) = 0) continue;string str = ./plugin/;str += pent
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 插件 框架 实验 报告 30
限制150内