欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    最新Linux插件框架实验报告.doc

    • 资源ID:33834018       资源大小:770.50KB        全文页数:32页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    最新Linux插件框架实验报告.doc

    精品资料精品资料.LinuxLinux 插件框架实验插件框架实验报告报告精品资料精品资料.电电 子子 科科 技技 大大 学学实实验验报报告告学生姓名:学生姓名:学学 号:号:指导指导教师:教师:实验地点:实验地点:A2-412A2-412实验时间:实验时间:2012.01.042012.01.04一、实验室名称:一、实验室名称:Linux 环境高级编程实验室二、实验项目名称:二、实验项目名称:插件框架实验三、实验学时:三、实验学时:4 学时四、实验目的:四、实验目的:学习和实践插件框架的开发。理解插件的工作原理,为进一步开发高可用,高复杂度的插件打下基础。五、实验内容:五、实验内容:精品资料精品资料.1、使用动态链接库实现打印功能:开发一个程序,向屏幕打印“Hello World”;在不重新编译链接原程序的前提下,将打印的文字改为“Hello China”。2、使用动态链接库实现自定义打印功能:同时要打印“Hello World”,打印“HelloChina”,甚至同时打印未来才会增加的其他打印信息,打印信息的链接库放在一个固定目录中,遍历这个目录,获取所有动态链接库。打印未来的这些信息,也不能重新编译链接原程序。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#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 = 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:#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 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,.)=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)();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;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 CPluginEnumerator: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/plugin/%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;CPluginEnumerator 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 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 (*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 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)();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 GetPluginNames(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)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.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 UninitializeController(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)CPluginController: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 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(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)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 IPrintPlugin精品资料精品资料.public:IPrintPlugin();virtual IPrintPlugin();virtual 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:CPrintPlugin()virtual CPrintPlugin()virtual void Print()cout Hello World! endl;精品资料精品资料.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 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 printhello china. endl;virtual 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(strcmp(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 CPluginEnumerator.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)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(), 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 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 CPluginController:IfProcess(char *Function)/判断插件是否存在unsigned int i;for(i = 0; i GetName() = 0)break;if(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_vhForPlugin.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 *Document);private:std:vector m_vhForPlugin;std:vector m_vpPlugin;#endifCPluginEnumerator.h#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include #include using namespace std;class CPluginEnumerator精品资料精品资料.public:CPluginEnumerator();virtual CPluginEnumerator();bool GetPluginNames(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)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.push_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);CPluginController 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! 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 IPrintPlugin();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;/statistics 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;精品资料精品资料.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(IPrintPlugin *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()virtual 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;/统计/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下插件开发的多种方法,尤其是综合试验中,对于插件的安装。这将很好的为以后的编程学习提供帮助。此外本次试验让我懂得了:耐心就会有结果!八、对本实验过程及方法、手段的改进建议:八、对本实验过程及方法、手段的改进建议:本次综合实验已经能够动态装、卸插件基本符合实际应用。以后的开发中应能用插件获取主体程序中的功能并修改。报告评分:报告评分:指导教师签字:指导教师签字:

    注意事项

    本文(最新Linux插件框架实验报告.doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开