Linux插件框架实验报告

合集下载

插件实习报告

插件实习报告

插件实习报告一、概述本次实习是在某科技公司的插件开发部门进行的,为期三个月。

在实习期间,我主要负责插件的设计、开发和测试工作,并参与了团队的日常项目管理和协作。

在这段时间里,我得到了很多宝贵的实践经验和技能提升。

二、实习内容1. 项目选题在实习开始之前,我经过与导师的讨论和需求分析,确定了一个基于浏览器的插件开发项目。

2.需求分析针对选定的项目,我首先进行了详细的需求分析,明确了插件的功能和用户需求。

通过与产品经理和设计师的沟通,我对插件的功能和界面进行了优化和改进,使其更符合用户的使用习惯。

3.设计与开发根据需求分析的结果,我开始了插件的设计和开发工作。

在设计阶段,我使用UML工具绘制了插件的架构图,并编写了详细的设计文档。

然后,我使用JavaScript和HTML/CSS等技术进行了插件的开发。

4.测试与优化在插件开发完成后,我进行了一系列的测试工作,包括单元测试、集成测试和系统测试等。

通过测试,我及时发现了一些潜在的问题并进行了优化和修复,确保插件的稳定性和功能完善性。

三、团队协作与项目管理在实习期间,我积极参与了团队的日常项目管理和协作工作。

我与团队成员一起参加了每周的项目会议,讨论项目进展和解决遇到的问题。

我还与其他实习生一起组成小组,共同完成了一个团队项目。

四、心得体会通过这次插件实习,我收获了很多。

首先,我深入了解了插件开发的流程和技术要点,提升了自己的技术能力。

其次,我学会了如何与他人进行有效的沟通和合作,在团队项目中锻炼了自己的协作能力。

最重要的是,我体验到了职场的工作环境和氛围,对自己的职业规划有了更清晰的认识。

五、总结与展望在插件实习的三个月里,我充分发挥了自己的专业能力,获得了实践经验和技能提升。

在未来,我将继续努力学习,不断提升自己的技术水平和综合能力,为公司的发展做出更大的贡献。

以上就是我在插件实习期间的报告,实习期间我充分发挥了自己的技术能力,也学到了很多实用的经验和知识。

linux实验报告小结

linux实验报告小结

linux实验报告小结什么是Linux实验报告?Linux实验报告是指在Linux操作系统上完成一系列实验任务后所形成的一份报告,用于记录实验过程、结果和思考,以及对实验的总结和分析。

它是计算机科学、软件工程、网络技术等相关专业学生在学习Linux操作系统时,进行实践的重要环节之一。

为什么需要写Linux实验报告?写Linux实验报告的目的有以下几个方面:1. 记录实验过程和结果:通过写实验报告,可以详细记录实验的具体步骤、使用的命令和配置文件以及实验结果。

这对于之后回顾和复习实验内容非常有帮助,也便于与他人沟通和分享实验经验。

2. 深化对Linux操作系统的理解:写实验报告是对实验内容进行回顾和总结的过程,通过梳理实验过程和思考,能够加深对Linux操作系统的理解和运用能力。

3. 锻炼实验报告写作能力:实验报告是一种学术写作形式,要求逻辑清晰、连贯性强,能够准确表达实验目的、方法和结果。

通过写实验报告,可以培养学生的实验报告写作能力和科学研究能力。

如何写好Linux实验报告?下面将从实验报告的结构、内容和写作技巧三个方面介绍如何写好一篇Linux实验报告。

一、实验报告的结构一般来说,一篇Linux实验报告包括以下几个部分:引言、实验目的、实验环境、实验步骤、实验结果与分析、实验总结和参考文献。

1. 引言:引言部分主要介绍实验的背景和目的,可以阐述实验的重要性和意义,也可以简要介绍相关理论和技术。

2. 实验目的:实验目的部分应该明确而具体,描述实验的具体要求和预期结果。

3. 实验环境:实验环境部分应该包括实验所使用的硬件和软件环境,例如操作系统版本、软件工具版本等。

4. 实验步骤:实验步骤部分应该详细记录实验的具体步骤,包括命令的使用和配置文件的修改等。

5. 实验结果与分析:实验结果与分析部分需要展示实验的结果,并对结果进行详细的分析和解释。

可以使用截图、表格等形式来展示结果。

6. 实验总结:实验总结部分应该对实验过程进行总结和评价,可以回顾实验的重要步骤和关键问题,指出实验中存在的不足和改进方向。

linux实验报告总结-共10篇

linux实验报告总结-共10篇

∣inux实验报告总结(共10篇)(Linux实验报告汇总)(一)Shell 编程一、实验目的:1)掌握在Linux下的C编程基本方法。

2)掌握shell编程方法。

3)掌握dialog图形化编程方法。

二、实验内容1、编写能输出“Hello world!”问候语的C程序,并在终端中编译、执行。

要求记录所使用的命令及结果。

#include stdio.hmain()(printf(Hello world!\n);)2、编写一个C程序并设置其在后台执行,其功能是在一段时间后(可自行设置),在屏幕上显示信息:Time for play!,写出相应的程序、命令及结果。

#include stdio.hmain()(int time=0;printf(请输入等待时间(单位:s):);scanf(%d/&time);sleep(time);printf(Time for play!\n);)3、编写C程序,求1到100之间整数的阶乘和,并对程序进行优化。

写出程序、命令和结果。

#include stdio.hmain()int i;double s = l,sum = 0;for( i= l;i= 100;i++)sum+=s*=i;printf( 1到100之间整数的阶乘和:%f\n,sum);printf( 1到100之间整数的阶乘和:%e\n,sum);}4、编写C程序,根据键盘输入的半径求圆面积,要求在命令行周率(P∣=3∙14,PI=3∙14159,PI=3.14159626 等)进行编使用不同的译,写出程序、命令和结果。

#include stdio.hint main()double r = 0.0 , Area = 0.0;printf(请输入半径:);scanf(%lf, &r);Area = PI * r * r;printf(圆面积:%f∖n, Area);)5、编写shell程序sh.l,完成向用户输出“你好!”的问候语。

linux实验报告

linux实验报告

linux实验报告实验目的:通过对Linux操作系统的实践,掌握基本的Linux命令和操作方法,了解Linux操作系统的特点和优势。

实验一:Linux环境搭建在实验一中,我们首先需要搭建Linux操作系统的环境。

根据实验指导书的要求,我们选择了Ubuntu作为实验平台。

通过下载Ubuntu镜像文件,并利用虚拟机软件创建一个虚拟机,将镜像文件安装到虚拟机中。

在安装过程中,我们需要选择合适的分区和网络配置等,并设置root用户的密码。

实验二:基本命令的使用在实验二中,我们主要学习了Linux的基本命令的使用方法。

首先,我们了解了Linux文件系统的结构,包括根目录、用户目录、系统目录等。

然后,通过命令行终端进行一系列的实践操作,比如查看文件内容、创建目录、复制文件等。

这些命令的使用不仅提高了我们的工作效率,同时也增强了对Linux操作系统的理解。

实验三:软件安装与卸载实验三主要涉及到Linux的软件安装与卸载。

我们首先学习了使用APT工具进行软件包管理,通过安装命令行界面的方式安装了一些常用的软件,比如文本编辑器、终端工具等。

此外,我们还学习了如何卸载已安装的软件包,清理不需要的文件,以保持系统的整洁性。

实验四:权限管理在实验四中,我们学习了Linux的权限管理机制。

Linux操作系统采用了基于用户和组的权限模型,通过设置文件和目录的权限,实现对文件的读、写、执行的控制。

我们通过实际操作,创建了新的用户和组,并为不同的用户和组设置了不同的权限。

这样,可以有效地保护系统的文件和数据的安全性。

实验五:网络配置与服务搭建在实验五中,我们主要学习了Linux的网络配置和服务搭建。

通过设置网络接口、IP地址和网关等参数,实现了网络的正常连接。

同时,我们还学习了一些常用的网络命令,比如ping、ssh等。

此外,我们尝试搭建了一个简单的Web服务器,通过浏览器访问,可以查看服务器上的网页。

实验六:系统监控和故障恢复在实验六中,我们学习了Linux的系统监控和故障恢复方法。

linux的实验报告

linux的实验报告

linux的实验报告Linux的实验报告引言:Linux作为一种开源操作系统,具有广泛的应用领域和强大的稳定性,已经成为计算机科学领域中不可或缺的一部分。

在本次实验中,我们将对Linux进行深入探索和实践,以了解其基本原理和功能。

一、Linux的起源与发展Linux诞生于1991年,由芬兰大学生林纳斯·托瓦兹(Linus Torvalds)开发而成。

起初,Linux只是一个小型的个人项目,但随着时间的推移,越来越多的程序员加入其中,使得Linux逐渐成为一个强大的操作系统。

二、Linux的核心特性1. 开源性:Linux的源代码对所有人开放,任何人都可以对其进行修改和改进。

这使得Linux具有强大的灵活性和可定制性。

2. 多用户和多任务:Linux支持多用户同时登录,并能够同时处理多个任务,大大提高了工作效率。

3. 稳定性和安全性:Linux具有出色的稳定性和安全性,很少出现崩溃和漏洞。

这使得Linux成为服务器和网络设备的首选操作系统。

4. 强大的命令行界面:Linux提供了强大的命令行界面,使得用户可以通过命令行操作来完成各种任务,提高了操作的灵活性和效率。

三、Linux的实验应用在本次实验中,我们通过以下几个方面对Linux进行了实践应用。

1. 安装和配置Linux操作系统首先,我们需要选择适合的Linux发行版,并进行安装和配置。

在安装过程中,我们需要选择合适的分区方案、安装软件包和设置用户账户等。

通过这一步骤,我们熟悉了Linux的安装过程和基本配置。

2. 熟悉Linux的文件系统Linux的文件系统与Windows有所不同,我们需要了解Linux的文件结构和文件路径。

在实验中,我们通过命令行界面进入不同的目录,创建和删除文件,以及修改文件权限等操作,深入了解了Linux的文件系统。

3. 学习Linux的基本命令Linux的命令行界面是其最大的特点之一,我们需要掌握一些基本的命令来完成各种任务。

框架技术实验报告教程(3篇)

框架技术实验报告教程(3篇)

第1篇一、实验目的1. 理解框架技术的概念和原理。

2. 掌握主流框架技术的应用场景和特点。

3. 通过实际操作,加深对框架技术的理解,提高编程能力。

二、实验环境1. 操作系统:Windows/Linux/MacOS2. 开发工具:IDE(如Visual Studio、Eclipse、IntelliJ IDEA等)3. 编程语言:Java/Python/Node.js等4. 数据库:MySQL/MongoDB等(根据所选框架技术选择)三、实验内容1. 前端框架(1)HTML5 + CSS3 + JavaScript实验步骤:1. 创建一个简单的HTML5页面,包含标题、段落、图片等元素。

2. 使用CSS3对页面进行样式设计,如设置背景颜色、字体、边框等。

3. 使用JavaScript编写脚本,实现页面的动态效果,如点击按钮显示弹窗等。

实验目的:掌握HTML5、CSS3和JavaScript的基本语法和用法,了解前端开发的基本流程。

(2)Vue.js实验步骤:1. 创建一个Vue.js项目,使用Vue CLI工具。

2. 在项目中创建组件,如头部、导航栏、内容区域等。

3. 使用Vue.js的数据绑定和指令,实现组件间的数据交互和动态渲染。

实验目的:了解Vue.js的基本概念和原理,掌握Vue.js的组件化开发方法。

(3)React实验步骤:1. 创建一个React项目,使用Create React App工具。

2. 在项目中创建组件,如头部、导航栏、内容区域等。

3. 使用React的JSX语法和组件生命周期,实现组件的渲染和交互。

实验目的:了解React的基本概念和原理,掌握React的组件化开发方法。

2. 后端框架(1)Spring Boot实验步骤:1. 创建一个Spring Boot项目,使用Spring Initializr工具。

2. 在项目中创建控制器(Controller),实现RESTful API的访问。

理工大学Linux实验报告

理工大学Linux实验报告

实验名称实验一Linux操作系统定制安装实验地点博学楼实验时间4月16日网络实验室一、实验目的和要求⑴通过对Linux 操作系统的定制安装,建立对Linux操作系统的初步认识,为后续实验的进行提供基础平台。

⑵掌握Linux操作系统的虚拟机定制安装。

⑶熟悉Linux文件目录结构二、实验内容和原理实验内容:利用虚拟机软件定制安装Linux操作系统,熟悉安装过程中各个选项的意义。

实验原理:虚拟机可以说是一种软件,也可以说是一种技术,它允许用户在一台主机上虚拟出多台计算机,每台虚拟的计算机都可以有自己的硬件及软件配置。

三、主要仪器设备PC机、VMware Player、Redhat/Ubuntu/Fedora四、操作方法与实验步骤⑴安装VMware Player⑵在VMware Player当中创建一个新的虚拟机,指定安装包的路径。

⑶安装定制Redhat Enterprise Linux 5.0说明:⑴对软件开发和和网络服务包进行定制。

⑵选择samba服务、nfs服务、tftp服务、Telnet服务和FTP服务⑶关闭系统防火墙、禁用SELinux服务。

⑷手动设置系统分区。

五、实验数据记录和处理1、安装Ubuntu进入界面:2、选择tftp服务3、对软件开发和网络服务包进行定制,都选择老的软件开发和老的网络服务器4、关闭系统防火网5、禁用SELinux服务六、实验结果与分析七、讨论、心得通过这次实验,在自己电脑的虚拟机上安装好了Ubuntu的镜像文件,并在Ubuntu下写了一些简单的命令,深深地感觉在虚拟机上运行Ubuntu远远要比双系统下方便得多,尤其是在两种不同系统下来回切换。

由于电脑上之前就已经安装过虚拟机,所以,实验报告中未对虚拟机的安装加以赘述。

实验名称实验二熟悉Linux系统的基本命令实验时间4月18日实验地点博学楼网络实验室一、实验目的和要求⑴熟悉Linux命令格式⑵学会如何获取命令帮助信息⑶熟练掌握Linux常用命令⑷掌握GCC命令的使用及其常用参数的含义二、实验内容和原理实验内容:系统设置命令、文件及文件夹操作命令、压缩与解压缩命令、自动补全与历史命令、管道与重定向命令、GCC命令的使用三、主要仪器设备PC机、装有Linux操作系统的虚拟机四、操作方法与实验步骤⑴练习以下常用命令的使用shutdown、reboot、logout、exit、useradd、userdel、su、cd、ls、touch、mkdir、cp、rm、rmdir、mv、more、less、man、du、find、clear、grep、cat、history、tar、unzip、chmod、管道命令|以及重定向命令⑵举例说明管道命令| 的使用⑶举例说明重定向命令<、<<、>、>>的使用⑷编写一个C的源程序,并用gcc进行编译,练习使用gcc的各个参数,理解参数的意义五、实验数据记录和处理1.cd、ls 、mkdir 新建hello文件夹2.cp 复制a到hello文件夹3.rm移除hello 中的a文件4.rmdir移除hello文件夹5.mv更改文件名字、移动文件6.du -b 以字节为单位显示cache目录的大小7.find / -name lolo搜索当前目录下名为lolo的文件8.grep 在lan/b.txt文件里查找字符3,并输出行号-n;输出b.txt内容9.grep重定向追加>>六、讨论、心得本次实验室是熟悉Linux的基本操作命令。

插件实习报告

插件实习报告

插件实习报告一、引言在如今数字化世界的浪潮下,软件开发行业的需求不断增长,插件开发作为一种重要的技术手段,在各种应用程序中发挥着重要作用。

本文将介绍我在插件开发领域的实习经历,分享我的学习和成长过程,以及在实习中所取得的成就和经验。

二、实习公司和项目背景我在一家知名的软件开发公司进行了为期三个月的插件开发实习。

实习期间,我参与了一个重要的项目,该项目旨在为公司的核心产品开发自定义插件系统,以增强产品的功能和可扩展性。

三、项目任务与挑战在实习期间,我面临了许多挑战,包括:1. 理解现有产品架构:首先,我需要深入了解公司的核心产品的架构和内部工作原理,以便能够为其开发定制插件。

2. 插件开发技能:我需要学习并掌握各种插件开发技术和工具,包括不同的编程语言和开发框架,以便能够根据项目需求进行插件开发。

3. 与团队协作:在项目中,我需要与其他开发人员和设计师密切合作,以确保插件与产品无缝集成,并具有良好的用户体验。

4. 项目管理:我需要管理我的工作时间,确保按照项目计划和期限完成任务。

四、学习和成长在实习期间,我取得了很大的进步。

以下是我在插件开发领域取得的学习和成长:1. 技术技能提升:通过参与项目,我掌握了多种编程语言和开发框架,包括JavaScript、Python和Java,以及各种插件开发工具。

我学会了如何编写高效、可扩展和可维护的插件代码。

2. 问题解决能力:在开发过程中,我经常面临各种技术难题和错误。

通过不断的尝试和学习,我提高了自己的问题解决能力,能够快速定位并解决问题。

3. 团队协作:与团队协作是一个重要的方面,我学会了有效地与团队成员沟通、分享想法,并共同解决问题。

这有助于项目的顺利进行和插件的成功开发。

4. 时间管理:我学会了合理安排时间,根据项目计划制定工作计划,确保任务按时完成。

五、取得的成就在实习期间,我为公司成功开发了多个定制插件,这些插件得到了用户的积极反馈。

我还参与了解决产品中的一些关键问题,提高了产品的稳定性和性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子科技大学实验报告学生姓名:学号:指导教师:实验地点: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 path[260];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 path[260];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(argv[1], "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(vstrPluginNames[i].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(argv[1], "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(argv[1], "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 CPluginEnumerator{public: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 CPluginController{public: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(vstrPluginNames[i].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_vpPlugin[i]->GetID() == FunctionID){m_vpPlugin[i]->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(vstrPluginNames[i].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_vhForPlugin[i]);}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.h"IPrintPlugin::IPrintPlugin(){}IPrintPlugin::~IPrintPlugin(){}Function.cpp#include <iostream>#include "IPrintPlugin.h"using namespace std;const int FUNC_ID = 1;class CPrintPlugin : public IPrintPlugin{public: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"const int FUNC_ID = 2;class CPrintPlugin : public IPrintPlugin{public: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>int main(int argc, char **argv){if(argc != 2){cout << "Parameters error" << endl;return 0;}if(strcmp(argv[1], "help") == 0){CPluginController pc;pc.ProcessHelp();return 0;}int FunctionID = atoi(argv[1]);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(vstrPluginNames[i].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_vpPlugin[i]->GetID() == FunctionID){m_vpPlugin[i]->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(vstrPluginNames[i].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_vpPlugin[i]->GetName()) == 0){break;}};if(i < m_vpPlugin.size())//插件存在{return true;}else{return false;}}bool CPluginController::ProcessFunction(char *Function,char*Document)//执行插件功能for(unsigned int i = 0; i < m_vpPlugin.size(); i++){if(strcmp(Function, m_vpPlugin[i]->GetName()) == 0){m_vpPlugin[i]->Fun(Document);//插件功能break;}}return true;}bool CPluginController::UninitializeController(){for(unsigned int i = 0; i < m_vhForPlugin.size(); i++){dlclose(m_vhForPlugin[i]);}return true;}CPluginController.h#ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include <vector>class IPrintPlugin;class CPluginController{public: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<void *> m_vhForPlugin;std::vector<IPrintPlugin*> m_vpPlugin;};#endifCPluginEnumerator.h#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include <vector>#include <string>using namespace std;class CPluginEnumerator{public: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;}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){if(strcmp(argv[1], "help") == 0)//帮助功能{CPluginController pc;pc.ProcessHelp();return 0;}else{int FunctionID = atoi(argv[1]);CPluginController pc;pc.InitializeController();pc.ProcessRequest(FunctionID);pc.UninitializeController();return 0;}}else if(argc == 3){CPluginController pc;char *Function = argv[1];// Function+=".so";char *Document = argv[2];//操作的文件名pc.InitializeController();if(pc.IfProcess(Function)==false)//判断插件是否存在{cout << "No this plugin!" << endl;}else//{pc.ProcessFunction(Function,Document);};pc.UninitializeController();return 0;}else{cout << "Parameters error" << endl;return 0;}}插件:IPrintPlugin.cpp#include "IPrintPlugin.h"IPrintPlugin::IPrintPlugin(){}IPrintPlugin::~IPrintPlugin(){}IPrintPlugin.h#pragma onceclass IPrintPlugin{public: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 <iostream>#include "IPrintPlugin.h"#include <unistd.h>//read(file)#include <fcntl.h>#include <string.h>using namespace std;const int FUNC_ID = 3;char FUNC_NAME[]="sl";//statistics line! class CPrintPlugin : public IPrintPlugin {public:CPrintPlugin(){}virtual ~CPrintPlugin()}virtual void Print(){cout << "Statistics the document line!" << endl;}virtual void Help(){cout << "Function ID " << FUNC_ID << " : This function will statistics 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){cout<<"Can not open: "<<Document<<endl;return ;};while(read(fp,&temp,1)){if(temp=='\n'){num++;}};close(fp);cout<<Document<<" lines is :"<<num<<endl;};extern "C" void CreateObj(IPrintPlugin **ppPlugin){static CPrintPlugin plugin;*ppPlugin = &plugin;}Words.cpp#include <iostream>#include "IPrintPlugin.h"#include <unistd.h>//read(file)#include <fcntl.h>using namespace std;const int FUNC_ID = 4;char FUNC_NAME[]="sw";//statistics wordsclass CPrintPlugin : public IPrintPlugin{public:CPrintPlugin(){}virtual ~CPrintPlugin(){}virtual void Print(){cout << "statistics the document words!" << endl;}virtual void Help(){cout << "Function ID " << FUNC_ID << " : This function will statistics 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){cout<<"Can not open: "<<Document<<endl;return ;};while(read(fp,&temp,1)){num++;};close(fp);if(num==0){cout<<"Empty file: "<<Document<<endl;return ;};cout<<Document<<"words is :"<<num<<endl;};};extern "C" void CreateObj(IPrintPlugin **ppPlugin) {static CPrintPlugin plugin;*ppPlugin = &plugin;}程序运行结果如图5所示:图5:插件获取类对象七、总结及心得体会:本次试验了解并大致掌握了linux下插件开发的多种方法,尤其是综合试验中,对于插件的安装。

相关文档
最新文档