《最新Linux插件框架实验报告.doc》由会员分享,可在线阅读,更多相关《最新Linux插件框架实验报告.doc(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品资料精品资料.LinuxLinux 插件框架实验插件框架实验报告报告精品资料精品资料.电电 子子 科科 技技 大大 学学实实验验报报告告学生姓名:学生姓名:学学 号:号:指导指导教师:教师:实验地点:实验地点:A2-412A2-412实验时间:实验时间:2012.01.042012.01.04一、实验室名称:一、实验室名称:Linux 环境高级编程实验室二、实验项目名称:二、实验项目名称:插件框架实验三、实验学时:三、实验学时:4 学时四、实验目的:四、实验目的:学习和实践插件框架的开发。理解插件的工作原理,为进一步开发高可用,高复杂度的插件打下基础。五、实验内容:五、实验内容:精品资料精
2、品资料.1、使用动态链接库实现打印功能:开发一个程序,向屏幕打印“Hello World”;在不重新编译链接原程序的前提下,将打印的文字改为“Hello China”。2、使用动态链接库实现自定义打印功能:同时要打印“Hello World”,打印“HelloChina”,甚至同时打印未来才会增加的其他打印信息,打印信息的链接库放在一个固定目录中,遍历这个目录,获取所有动态链接库。打印未来的这些信息,也不能重新编译链接原程序。3、1)通过命令行方式:./a.out help,输出所有插件实现的功能 ID,以及该功能 ID 对应的功能描述。2)通过命令行方式:./a.out FuncID,调用具
3、体打印功能(每个插件导出 GetID 接口)。4、将插件导出的 Print、GetID、Help 三个函数放在一个类中,主程序需要使用多个容器分别保存这些函数地址,让插件外部获取该类的对象。综合练习综合练习:实现一个软件系统,该系统可对文件进行统计分析。究竟对文件进行什么样的统计分析,最终用户自己也不是很清楚,目前只知道需要统计文件的行数。也就是说,本软件系统将会随时面临,增加文精品资料精品资料.件统计新功能的难题。请结合本实验内容,设计并实现这样一个面向文件统计功能的插件系统。(需要实现的插件包括:统计某个文件的行数,统计某个文件的字节数)六、实验步骤:六、实验步骤:程序 1:A.h:ext
4、ern 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 endl;Main.cpp:精品资料精品资料.#includea.h#include#includeusing namespace std;int main()void *handle = dlopen(./libtest.so, RTLD_LAZY);if(0 = hand
5、le)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:#includeusing namespace std;externC void f()cout Hello world endl;A2.c
6、pp:#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 namespace std;extern C void f()cout Hello 4444 endl;Test2.cpp:#include#include#include#include#includeusing namespace std;精品资料精品资料.int m
7、ain()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;sprintf(path,/root/test/test4/plug2/plugin/%s, ptr-d_name);void *handle = dlopen(path, RTLD_LAZY);if(0 = handle)cout dlo
8、pen 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(handle);closedir(dir);程序运行结果如图 2 所示:精品资料精品资料.图 2:插件的遍历程序 3:a1.cpp:#include using namespace std;const int FUNC_ID = 1;extern C void f(
9、)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 void f()cout Hello China! endl;extern C void Help()cout Function ID FUNC_ID This function prints hello china. endl;CPluginE
10、numerator.cpp#include CPluginEnumerator.h#include #include 精品资料精品资料.#include #include CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector& vstrPluginNames)DIR *dir = opendir(/root/test/test4/plug3/plugin);if(dir = 0)return false;for(
11、;)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-d_name);vstrPluginNames.push_back(path);closedir(dir);return true;Test.cpp:#include #include #include CPluginEnumera
12、tor.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 enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)cout GetPluginNames error endl;return 0;for(int i = 0; i
13、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 = (FUNC_HELP)dlsym(handle, Help);if(dl_help = 0)cout dlsym error endl;return 0;(dl_help)();dlclose(handle);else if(strcmp(a
14、rgv1, 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)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, f);if(dl_print = 0)cout dlsym error endl;return 0;(dl_print)(
15、);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 endl;return 0;typedef void (*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, f);if(dl_print = 0)c
16、out 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 namespace std;class CPluginEnumeratorpublic:CPluginEnumerator();virtual CPluginEnumerator();bool G
17、etPluginNames(vector& vstrPluginNames);#endifCPluginEnumerator.cpp:#include CPluginEnumerator.h#include #include CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()精品资料精品资料.bool CPluginEnumerator:GetPluginNames(vector& vstrPluginNames)DIR *dir = opendir(./plugin);if(dir = 0)re
18、turn 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;vstrPluginNames.push_back(str);closedir(dir);return true;CPluginController.h#ifndef CPLUGINCONTROLLE
19、R_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);private:std:vector m_v
20、hForPlugin;std:vector m_vpPlugin;#endifCPluginController.cpp#include CPluginController.h#include CPluginEnumerator.h#include IPrintPlugin.h#include dlfcn.hCPluginController:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector vst
21、rPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return 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(),
22、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(pPlugin);return true;bool CPluginController:ProcessRequest(int FunctionID)for(unsigned
23、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)return false;for(unsigned int i=0 ; iHelp();dlclose(hinstLib);return true;bool CPlugin
24、Controller:UninitializeController()for(unsigned int i = 0; i m_vhForPlugin.size(); i+)dlclose(m_vhForPlugini);return true;IPrintPlugin.h#pragma onceclass IPrintPlugin精品资料精品资料.public:IPrintPlugin();virtual IPrintPlugin();virtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;IPrintP
25、lugin.cpp#include IPrintPlugin.hIPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()Function.cpp#include #include IPrintPlugin.husing namespace std;const int FUNC_ID = 1;class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout Hello World! endl;精品
26、资料精品资料.virtual void Help()cout Function ID FUNC_ID : This function will printhello world. endl;virtual int GetID(void)return FUNC_ID;extern C void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;function1.cpp#include #include IPrintPlugin.husing namespace std;const in
27、t 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 printhello china. endl;virtual int GetID(void)return FUNC_ID;extern C void CreateObj(I
28、PrintPlugin *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(strcmp(argv1, help) = 0)CPluginController pc;pc.ProcessHelp();retu
29、rn 0;int FunctionID = atoi(argv1);CPluginController pc;精品资料精品资料.pc.InitializeController();pc.ProcessRequest(FunctionID);pc.UninitializeController();return 0;程序运行结果如图 4 所示:图 4:插件获取类对象综合练习:CPluginController.cpp#include CPluginController.h#include CPluginEnumerator.h#include IPrintPlugin.h#include dlfc
30、n.h#include CPluginController:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)精品资料精品资料.std:vector vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; ivstrPlugi
31、nNames.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_CREATE)dlsym(hinstLib,CreateObj);if(NULL != Crea
32、teProc)(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:ProcessHelp(void)std:vector vstrPluginN
33、ames;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(i m_vpPlugin.size()/插件存在retur
34、n 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_vhForPlugin.size(); i+)dlclose(m_vhFo
35、rPlugini);精品资料精品资料.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
36、(void);bool ProcessRequest(int FunctionID);bool IfProcess(char *Function);bool ProcessFunction(char *Function,char *Document);private:std:vector m_vhForPlugin;std:vector m_vpPlugin;#endifCPluginEnumerator.h#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include #include using namespace std;cl
37、ass CPluginEnumerator精品资料精品资料.public:CPluginEnumerator();virtual CPluginEnumerator();bool GetPluginNames(vector& vstrPluginNames);#endifCPluginEnumerator.cpp#include CPluginEnumerator.h#include #include CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:
38、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;vstrPluginNames.pus
39、h_back(str);精品资料精品资料.closedir(dir);return true;Main.cpp#include #include CPluginController.h#include #include using namespace std;int main(int argc, char *argv)if(argc = 2)if(strcmp(argv1, help) = 0)/帮助功能CPluginController pc;pc.ProcessHelp();return 0;elseint FunctionID = atoi(argv1);CPluginControlle
40、r pc;pc.InitializeController();pc.ProcessRequest(FunctionID);pc.UninitializeController();return 0;else if(argc = 3)CPluginController pc;char *Function = argv1;/Function+=.so;char *Document = argv2;/操作的文件名精品资料精品资料.pc.InitializeController();if(pc.IfProcess(Function)=false)/判断插件是否存在cout No this plugin!
41、 endl;else/pc.ProcessFunction(Function,Document);pc.UninitializeController();return 0;elsecout Parameters error endl;return 0;插件:插件:IPrintPlugin.cpp#include IPrintPlugin.hIPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()IPrintPlugin.h#pragma onceclass IPrintPluginpublic:IPrintPlugin();virtual I
42、PrintPlugin();virtual void Help() = 0;virtual void Print() = 0;精品资料精品资料.virtual int GetID() = 0;virtual char * GetName() = 0;/添加部分virtual void Fun(char*) = 0;Line.cpp#include #include IPrintPlugin.h#include /read(file)#include #include using namespace std;const int FUNC_ID = 3;char FUNC_NAME=sl;/sta
43、tistics line!class CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout Statistics the document line! endl;virtual void Help()cout Function ID FUNC_ID : This function willstatistics the document line. endl;virtual int GetID(void)return FUNC_ID;精品资料精品资
44、料.virtual char *GetName()return FUNC_NAME;virtual void Fun(char *Document)int fp;char temp;long num=0;/统计/open fileif(fp=open(Document,O_RDONLY)=-1)coutCan not open: Documentendl;return ;while(read(fp,&temp,1)if(temp=n)num+;close(fp);coutDocument lines is :numendl;extern C void CreateObj(IPrintPlugi
45、n *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;Words.cpp#include #include IPrintPlugin.h#include /read(file)#include using namespace std;const int FUNC_ID = 4;精品资料精品资料.char FUNC_NAME=sw;/statistics wordsclass CPrintPlugin : public IPrintPluginpublic:CPrintPlugin()virtual CPrintPlugin()vi
46、rtual void Print()cout statistics the document words! endl;virtual void Help()cout Function ID FUNC_ID : This function willstatistics the document words. endl;virtual int GetID(void)return FUNC_ID;virtual char *GetName()return FUNC_NAME;virtual void Fun(char *Document)int fp;char temp;long num=0;/统计
47、/open fileif(fp=open(Document,O_RDONLY)=-1)coutCan not open: Documentendl;return ;精品资料精品资料.;while(read(fp,&temp,1)num+;close(fp);if(num=0)coutEmpty file: Documentendl;return ;coutDocumentwords is :numendl;extern C void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;程序运行结果如图 5 所示:图 5:插件获取类对象精品资料精品资料.七、总结及心得体会:七、总结及心得体会:本次试验了解并大致掌握了 linux下插件开发的多种方法,尤其是综合试验中,对于插件的安装。这将很好的为以后的编程学习提供帮助。此外本次试验让我懂得了:耐心就会有结果!八、对本实验过程及方法、手段的改进建议:八、对本实验过程及方法、手段的改进建议:本次综合实验已经能够动态装、卸插件基本符合实际应用。以后的开发中应能用插件获取主体程序中的功能并修改。报告评分:报告评分:指导教师签字:指导教师签字:
限制150内