Linux插件框架实验报告.doc

上传人:大张伟 文档编号:6356058 上传时间:2020-11-01 格式:DOC 页数:30 大小:665KB
返回 下载 相关 举报
Linux插件框架实验报告.doc_第1页
第1页 / 共30页
Linux插件框架实验报告.doc_第2页
第2页 / 共30页
Linux插件框架实验报告.doc_第3页
第3页 / 共30页
Linux插件框架实验报告.doc_第4页
第4页 / 共30页
Linux插件框架实验报告.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《Linux插件框架实验报告.doc》由会员分享,可在线阅读,更多相关《Linux插件框架实验报告.doc(30页珍藏版)》请在三一文库上搜索。

1、电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点:A2-412 实验时间:2012.01.04一、实验室名称:Linux环境高级编程实验室二、实验项目名称:插件框架实验三、实验学时:4学时四、实验目的:学习和实践插件框架的开发。理解插件的工作原理,为进一步开发高可用,高复杂度的插件打下基础。五、实验内容:1、使用动态链接库实现打印功能:开发一个程序,向屏幕打印“Hello World”;在不重新编译链接原程序的前提下,将打印的文字改为“Hello China”。2、使用动态链接库实现自定义打印功能:同时要打印“Hello World”,打印“Hello China”

2、,甚至同时打印未来才会增加的其他打印信息,打印信息的链接库放在一个固定目录中,遍历这个目录,获取所有动态链接库。打印未来的这些信息,也不能重新编译链接原程序。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() cout Hello,Word

4、 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 endl; (*f1)();

5、 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:#includeusing namespa

6、ce 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,.)=0)continue

7、;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)();dlclose(han

8、dle); 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;extern C voi

9、d 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 CPluginEnumerator:GetP

10、luginNames(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/plugin/%s, ptr

11、-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; CPluginEnumerator e

12、numerator; 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 dl_help = (F

13、UNC_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 (*FUNC_PRINT)(

14、);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 dlopen error en

15、dl;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 #include using na

16、mespace std;class CPluginEnumeratorpublic: CPluginEnumerator(); virtual CPluginEnumerator(); bool GetPluginNames(vector& vstrPluginNames);#endifCPluginEnumerator.cpp:#include CPluginEnumerator.h#include #include CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEn

17、umerator: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 += pentry-d_name;vst

18、rPluginNames.push_back(str); closedir(dir); return true;CPluginController.h#ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include class IPrintPlugin;class CPluginControllerpublic:CPluginController(void);virtual CPluginController(void);bool InitializeController(void);bool UninitializeControll

19、er(void);bool ProcessHelp(void);bool ProcessRequest(int FunctionID);private:std:vector m_vhForPlugin;std:vector m_vpPlugin;#endifCPluginController.cpp#include CPluginController.h#include CPluginEnumerator.h#include IPrintPlugin.h#include dlfcn.hCPluginController:CPluginController(void)CPluginControl

20、ler:CPluginController(void)bool CPluginController:InitializeController(void)std:vector vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; ivstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE

21、CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) m_vhForPlugin.push_back(hinstLib);CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, CreateObj); if(NULL != CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)m_vpPlugin.push_back(

22、pPlugin);return true;bool CPluginController:ProcessRequest(int FunctionID)for(unsigned int i = 0; i GetID() = FunctionID)m_vpPlugini-Print();break;return true;bool CPluginController:ProcessHelp(void)std:vector vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames

23、)return false;for(unsigned int i=0 ; iHelp();dlclose(hinstLib);return true;bool CPluginController:UninitializeController()for(unsigned int i = 0; i m_vhForPlugin.size(); i+)dlclose(m_vhForPlugini);return true;IPrintPlugin.h#pragma onceclass IPrintPluginpublic:IPrintPlugin();virtual IPrintPlugin();vi

24、rtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;IPrintPlugin.cpp#include IPrintPlugin.hIPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()Function.cpp#include #include IPrintPlugin.husing namespace std;const int FUNC_ID = 1;class CPrintPlugin : public IPrintPluginpublic:CPr

25、intPlugin()virtual CPrintPlugin()virtual void Print()cout Hello World! endl;virtual void Help()cout Function ID FUNC_ID : This function will print hello world. endl;virtual int GetID(void)return FUNC_ID;extern C void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;fun

26、ction1.cpp#include #include IPrintPlugin.husing namespace std;const int FUNC_ID = 2;class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout Hello China! endl;virtual void Help()cout Function ID FUNC_ID : This function will print hello china. endl;v

27、irtual int GetID(void)return FUNC_ID;extern C void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;Main.cpp#include #include CPluginController.h#include #include using namespace std;int main(int argc, char *argv)if(argc != 2)cout Parameters error endl;return 0;if(strc

28、mp(argv1, help) = 0)CPluginController pc;pc.ProcessHelp();return 0;int FunctionID = atoi(argv1);CPluginController pc;pc.InitializeController();pc.ProcessRequest(FunctionID);pc.UninitializeController();return 0;程序运行结果如图4所示:图4:插件获取类对象综合练习:CPluginController.cpp#include CPluginController.h#include CPlug

29、inEnumerator.h#include IPrintPlugin.h#include dlfcn.h#include CPluginController:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)retur

30、n false;for(unsigned int i=0 ; ivstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) m_vhForPlugin.push_back(hinstLib);CreateProc = (PLUGIN_CREA

31、TE)dlsym(hinstLib, CreateObj); if(NULL != CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)m_vpPlugin.push_back(pPlugin);return true;bool CPluginController:ProcessRequest(int FunctionID)for(unsigned int i = 0; i GetID() = FunctionID)m_vpPlugini-Print();break;return true;bool CPluginController:P

32、rocessHelp(void)std:vector vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; iHelp();dlclose(hinstLib);return true;bool CPluginController:IfProcess(char *Function)/判断插件是否存在unsigned int i;for(i = 0; i GetName() = 0)break;if(

33、i m_vpPlugin.size()/插件存在return true;elsereturn false;bool CPluginController:ProcessFunction(char *Function,char*Document)/执行插件功能for(unsigned int i = 0; i GetName() = 0)m_vpPlugini-Fun(Document);/插件功能break;return true;bool CPluginController:UninitializeController()for(unsigned int i = 0; i m_vhForPlu

34、gin.size(); i+)dlclose(m_vhForPlugini);return true;CPluginController.h#ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include class IPrintPlugin;class CPluginControllerpublic:CPluginController(void);virtual CPluginController(void);bool InitializeController(void);bool UninitializeController(void);bool ProcessHelp(void);bool ProcessRequest(int FunctionID);bool IfProcess(char *Function);bool ProcessFunction(char *Function,char *Doc

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1