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

    Linux插件框架实验报告.doc

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

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

    Linux插件框架实验报告.doc

    ,电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点: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<iostream>#include"a.h"using namespace std;void f() cout << "hello,China!" << endl;A1.cpp:#include<iostream>#include"a.h"using namespace std;void f() cout << "Hello,Word" << endl;Main.cpp:#include"a.h"#include<dlfcn.h>#include<iostream>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<iostream>using namespace std;extern"C" void f()cout << "Hello world" << endl;A2.cpp:#include<iostream>using namespace std;extern "C" void f() cout << "Hello,china!" << endl;A3.cpp:#include<iostream>using namespace std;extern "C" void f()cout << "Hello 333" << endl;A4.cpp:#include<iostream>using namespace std;extern "C" void f()cout << "Hello 4444" << endl;Test2.cpp:#include<dlfcn.h>#include<iostream>#include<dirent.h>#include<stdio.h>#include<string.h>using 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 <iostream>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 <iostream>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 <dirent.h>#include <string.h>#include <iostream>#include <stdio.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& 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 <dlfcn.h>#include <iostream>#include "CPluginEnumerator.h"#include <string.h>#include <stdio.h>using namespace std;int main(int argc, char *argv)char path 260; if(argc != 2)return 0; if(strcmp(argv1, "help") = 0) vector<string> 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 <vector>#include <string>using namespace std;class CPluginEnumeratorpublic: CPluginEnumerator(); virtual CPluginEnumerator(); bool GetPluginNames(vector<string>& vstrPluginNames);#endifCPluginEnumerator.cpp:#include "CPluginEnumerator.h"#include <dirent.h>#include <string.h>CPluginEnumerator:CPluginEnumerator()CPluginEnumerator:CPluginEnumerator()bool CPluginEnumerator:GetPluginNames(vector<string>& 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 <vector>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<void *> m_vhForPlugin;std:vector<IPrintPlugin*> m_vpPlugin;#endifCPluginController.cpp#include "CPluginController.h"#include "CPluginEnumerator.h"#include "IPrintPlugin.h"#include "dlfcn.h"CPluginController:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.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 < m_vpPlugin.size(); i+)if(m_vpPlugini->GetID() = FunctionID)m_vpPlugini->Print();break;return true;bool CPluginController:ProcessHelp(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj"); if(NULL != CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)pPlugin->Help();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();virtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;IPrintPlugin.cpp#include "IPrintPlugin.h"IPrintPlugin:IPrintPlugin()IPrintPlugin:IPrintPlugin()Function.cpp#include <iostream>#include "IPrintPlugin.h"using 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 print hello world." << endl;virtual int GetID(void)return FUNC_ID;extern "C" void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;function1.cpp#include <iostream>#include "IPrintPlugin.h"using 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;virtual int GetID(void)return FUNC_ID;extern "C" void CreateObj(IPrintPlugin *ppPlugin)static CPrintPlugin plugin;*ppPlugin = &plugin;Main.cpp#include <iostream>#include "CPluginController.h"#include <string.h>#include <stdlib.h>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 <string.h>CPluginController:CPluginController(void)CPluginController:CPluginController(void)bool CPluginController:InitializeController(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.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 < m_vpPlugin.size(); i+)if(m_vpPlugini->GetID() = FunctionID)m_vpPlugini->Print();break;return true;bool CPluginController:ProcessHelp(void)std:vector<std:string> vstrPluginNames;CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)return false;for(unsigned int i=0 ; i<vstrPluginNames.size(); i+)typedef int (*PLUGIN_CREATE)(IPrintPlugin*);PLUGIN_CREATE CreateProc; IPrintPlugin *pPlugin = NULL;void* hinstLib = dlopen(vstrPluginNamesi.c_str(), RTLD_LAZY); if(hinstLib != NULL) CreateProc = (PLUGIN_CREATE)dlsym(hinstLib, "CreateObj"); if(NULL != CreateProc) (CreateProc)(&pPlugin);if(pPlugin != NULL)pPlugin->Help();dlclose(hinstLib);return true;bool CPluginController:IfProcess(char *Function)/判断插件是否存在unsigned int i;for(i = 0; i < m_vpPlugin.size(); i+)if(strcmp(Function, m_vpPlugini->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 < m_vpPlugin.size(); i+)if(strcmp(Function, m_vpPlugini->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 <vector>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

    注意事项

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

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




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

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

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

    收起
    展开