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. 时间管理:我学会了合理安排时间,根据项目计划制定工作计划,确保任务按时完成。

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

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

linux实验报告总结与体会

linux实验报告总结与体会

linux实验报告总结与体会
一、实验内容
本次实验的主要内容是Linux系统的安装、配置以及使用,包括Linux系统的安装、操作系统的配置、文件和目录的管理、文件系统权限管理以及进程和用户管理等。

二、实验结果
1、配置 yum 源
在配置yum源时,我参照了一些网上的教程,使用了Cent OS7 的网络镜像源作为yum源。

使用yum命令可以调取网络上的软件仓库,并自动下载安装,避免了手动下载并安装的麻烦,使安装更加便捷。

2、部署 Apache服务器
Apache服务器是一款功能强大的web服务器,是许多开源网站或网站开发项目的经典选择。

从yum库中安装apahce 服务器非常的方便。

在部署好Apache服务器之后,成功在浏览器中显示出Apache 的测试页面,表明Apache服务器配置成功。

三、实验体会
由于Linux是一款开源软件,因此拥有更为强大的功能和更高的性能。

本次实验,我学会了Linux的安装、文件和目录管理、文件系统权限管理以及进程和用户管理等,这些都是Linux系统里的基本操作,我也学会了如何配置 yum 源,以及如何部署 Apache 服务器等。

通过本次实验,我对Linux有了更加深入的了解,也掌握了Linux的基本操作技能,对深入研究Linux有了更大的兴趣。

linux实验报告

linux实验报告

linux实验报告Linux 实验报告一、实验目的本次 Linux 实验的主要目的是熟悉 Linux 操作系统的基本命令和操作,了解其文件系统、进程管理、用户权限等核心概念,并通过实际操作加深对这些知识的理解和应用能力。

二、实验环境本次实验使用的是虚拟机软件 VirtualBox 安装的 Ubuntu 2004 LTS 操作系统。

三、实验内容及步骤(一)用户和权限管理1、使用`sudo adduser` 命令创建新用户`user1` 和`user2`。

2、使用`sudo passwd user1` 和`sudo passwd user2` 为新用户设置密码。

3、使用`sudo usermod aG sudo user1` 将`user1` 添加到`sudo` 组,使其具有管理员权限。

4、以`user1` 身份登录系统,创建一个文件`file1txt`,尝试修改其权限为 777,观察权限变化。

(二)文件和目录操作1、使用`mkdir` 命令创建目录`directory1` 和`directory2`。

2、使用`touch` 命令在当前目录下创建文件`file2txt` 和`file3txt`。

3、使用`cp` 命令将`file2txt` 复制到`directory1` 目录下。

4、使用`mv` 命令将`file3txt` 移动到`directory2` 目录下。

5、使用`rm` 命令删除`file2txt` 和`directory2` 目录及其下的所有文件。

(三)进程管理1、使用`ps` 命令查看当前系统中的进程信息。

2、使用`top` 命令实时监控系统的进程状态。

3、使用`kill` 命令结束指定进程(例如,通过进程 ID 结束一个占用大量资源的进程)。

(四)文件系统管理1、使用`df` 命令查看磁盘空间使用情况。

2、使用`du` 命令查看目录或文件的磁盘使用量。

3、使用`mount` 命令挂载一个新的磁盘分区(假设已经在虚拟机中添加了新的磁盘分区)。

linux实验系统实验报告

linux实验系统实验报告

linux实验系统实验报告Linux实验系统实验报告一、引言Linux实验系统是一个基于Linux操作系统的实验平台,旨在提供一个实践学习的环境,帮助学生深入了解Linux操作系统的原理和应用。

本实验报告旨在总结和分析我在使用Linux实验系统进行实验时的经验和收获。

二、实验环境1. 硬件环境:我使用的是一台配备Intel Core i5处理器和8GB内存的个人电脑。

2. 软件环境:我下载并安装了Linux实验系统的最新版本,该版本基于Ubuntu操作系统,并预装了一系列常用的开发工具和软件包。

三、实验内容1. 实验一:Linux基础命令的使用在这个实验中,我通过终端窗口使用了一些常用的Linux命令,如ls、cd、mkdir、rm等。

通过实际操作,我熟悉了Linux文件系统的结构和基本操作,掌握了如何在Linux中创建、删除和移动文件夹,以及如何查看文件和文件夹的属性。

2. 实验二:Shell脚本编程这个实验要求我们使用Shell脚本编写一个简单的程序,实现对指定文件夹中所有文件进行备份的功能。

通过这个实验,我学会了如何使用Shell编程语言,掌握了一些基本的语法和命令,比如if语句、for循环和cp命令。

我还学会了如何将Shell脚本保存为可执行文件,并在终端中运行。

3. 实验三:网络配置与管理这个实验主要涉及Linux系统的网络配置和管理。

我学会了如何配置网络接口,包括设置IP地址、子网掩码和网关。

我还学会了如何使用ping命令测试网络连接,以及如何使用ifconfig命令查看和管理网络接口的状态。

通过这个实验,我对Linux系统的网络配置有了更深入的了解。

四、实验收获通过使用Linux实验系统进行实验,我获得了以下收获:1. 对Linux操作系统有了更深入的了解:通过实际操作,我对Linux操作系统的基本原理和文件系统有了更深入的了解。

我学会了如何在Linux中进行文件和文件夹的管理,以及如何使用命令行界面进行各种操作。

linux系统使用实验报告

linux系统使用实验报告

linux系统使用实验报告Linux 系统使用实验报告一、实验目的本次实验旨在深入了解和熟悉 Linux 操作系统的基本操作、命令行使用以及系统配置,掌握常见的文件管理、进程管理、用户权限管理等功能,提高对 Linux 系统的实际应用能力。

二、实验环境1、操作系统:Ubuntu 2004 LTS2、实验工具:终端模拟器(Terminal)三、实验内容与步骤(一)系统登录与基本命令1、启动计算机,选择 Ubuntu 操作系统,输入用户名和密码登录系统。

2、打开终端模拟器,熟悉常用的基本命令,如`ls` (列出当前目录下的文件和文件夹)、`cd` (切换目录)、`mkdir` (创建新目录)、`rmdir` (删除空目录)等。

(二)文件管理1、在用户主目录下创建一个名为`experiment` 的文件夹,使用`mkdir experiment` 命令。

2、进入该文件夹,使用`cd experiment` 命令。

3、在`experiment` 文件夹中创建一个文本文件`filetxt` ,使用`touch filetxt` 命令。

4、使用`vi` 或`nano` 编辑器打开`filetxt` 文件,输入一些文本内容,并保存退出。

5、查看文件的内容,使用`cat filetxt` 命令。

6、复制文件,使用`cp filetxt file_copytxt` 命令。

7、移动文件,使用`mv filetxt/`命令将文件移动到上级目录。

8、删除文件,使用`rm file_copytxt` 命令。

(三)进程管理1、运行一个后台进程,例如`ping &`,然后使用`jobs` 命令查看后台进程。

2、将后台进程切换到前台,使用`fg %1` (其中%1 为后台进程的编号)命令。

3、终止进程,使用`Ctrl + C` 组合键终止正在运行的进程。

4、查看系统当前运行的进程,使用`ps aux` 命令。

(四)用户权限管理1、创建一个新用户,使用`sudo adduser username` 命令,其中`username` 为新用户的用户名。

linux程序设计实验报告

linux程序设计实验报告

linux程序设计实验报告Linux程序设计实验报告引言在计算机科学领域,操作系统是一项至关重要的基础设施。

Linux作为一种开源的操作系统,具有广泛的应用和开发者社区。

本次实验旨在通过Linux程序设计,深入了解Linux操作系统的内部机制和编程技巧。

一、实验背景与目的Linux操作系统以其稳定性、安全性和灵活性而闻名。

本次实验的目的是通过编写Linux程序,探索Linux操作系统的核心原理和实践技巧。

通过实践操作,我们可以更好地理解Linux内核、进程管理、文件系统和网络通信等方面的工作原理。

二、实验环境与工具本次实验使用的实验环境为Ubuntu操作系统,我们将使用C语言进行程序设计。

以下是本次实验所用到的工具和软件:1. Ubuntu 18.04 LTS操作系统2. GCC编译器3. GNU Make工具4. Vim文本编辑器三、实验内容与步骤1. 进程管理在Linux操作系统中,进程是程序的执行实例。

我们将通过编写一个简单的多进程程序来理解进程的创建、调度和终止。

首先,我们需要使用fork()系统调用创建一个新的子进程。

然后,通过exec()系统调用加载一个新的程序到子进程中。

最后,使用wait()系统调用等待子进程的结束并回收资源。

2. 文件系统Linux操作系统中的文件系统是一种层次化的存储结构。

我们将通过编写一个简单的文件读写程序来理解文件系统的基本操作。

首先,我们需要使用open()系统调用打开一个文件,并指定读写权限。

然后,使用read()和write()系统调用读取和写入文件的内容。

最后,使用close()系统调用关闭文件。

3. 网络通信Linux操作系统提供了丰富的网络通信功能。

我们将通过编写一个简单的网络通信程序来理解网络套接字的使用。

首先,我们需要使用socket()系统调用创建一个套接字,并指定通信协议。

然后,使用bind()系统调用将套接字绑定到指定的IP地址和端口号。

linux系统实训报告

linux系统实训报告

linux系统实训报告(注:以下是一份示例报告,具体内容可以根据实际情况自行修改和补充)1. 简介本报告对Linux系统实训进行总结和分析。

Linux是一种开源操作系统,具有稳定性和可靠性,并且在云计算、服务器和嵌入式系统等领域广泛应用。

在实训过程中,我们学习了Linux系统的安装、配置和管理,掌握了Linux命令行和GUI界面的使用,并了解了Linux系统的网络配置和安全性。

2. 实训内容和目标2.1 实训内容(详细列出实训所涉及的主要内容和任务)2.2 实训目标(简洁明了地列出实训的主要目标和学习成果)3. 实训过程(描述实训的具体过程,包括学习和实践的环节)4. 实训成果4.1 实践技能通过实训,我们掌握了Linux系统的基本操作和管理技能。

我们能够使用命令行界面进行文件和目录管理,熟悉常用的Linux命令,如ls、cd、mkdir、rm等。

同时,我们也学会了使用Linux的图形用户界面(GUI)进行更直观和友好的操作。

4.2 安全性我们了解了Linux系统的安全性措施和实施方法。

通过实践,我们学会了设置用户和组的权限,控制对文件和目录的访问权限。

我们还学习了如何使用防火墙、访问控制清单(ACL)和加密等安全措施来保护系统和数据的安全。

4.3 网络配置我们学习了Linux系统的网络配置和管理。

通过实践,我们能够配置网络接口、设置IP地址和子网掩码,以建立和管理网络连接。

我们还了解了Linux的网络工具和服务,如ping、curl、ssh等。

5. 实训中遇到的问题和解决方法在实训过程中,我们可能会遇到各种技术和操作上的问题。

我们通过查阅文档、互相讨论和请教老师等方式解决了这些问题。

例如,我们可能会遇到软件安装失败、命令行操作错误等问题,通过调试和尝试,我们找到了具体的解决方法。

6. 实训心得和建议通过实训,我们深入了解了Linux系统,掌握了实际应用中的操作和管理技能。

实训过程中,我们感受到了学习的乐趣和挑战,并收获了宝贵的经验。

linux实验报告总结

linux实验报告总结

linux实验报告总结《Linux 实验报告总结》在学习计算机技术的过程中,Linux 操作系统的重要性日益凸显。

为了更深入地了解和掌握 Linux 的相关知识和技能,我进行了一系列的实验。

通过这些实验,我不仅增强了对 Linux 系统的操作能力,还对其原理和应用有了更深刻的认识。

一、实验目的本次 Linux 实验的主要目的是熟悉 Linux 操作系统的基本命令和操作,了解文件系统的结构和管理,掌握进程管理和系统监控的方法,以及学会配置网络服务和进行系统安全设置。

二、实验环境实验所使用的操作系统是 Ubuntu 2004 LTS 版本,在虚拟机中进行安装和配置。

虚拟机软件为 VMware Workstation Pro 16,硬件配置为4GB 内存、2 个 CPU 核心和 20GB 硬盘空间。

三、实验内容及步骤(一)用户和权限管理1、创建新用户使用`adduser` 命令创建了新用户`user1`,并为其设置了密码。

2、赋予用户权限通过修改`/etc/sudoers` 文件,赋予`user1` 部分管理员权限,使其能够执行一些特定的系统管理命令。

(二)文件和目录操作1、文件创建和编辑使用`touch` 命令创建了一个空文件`filetxt`,然后使用`vi` 或`nano` 编辑器对其进行内容编辑。

2、目录创建和管理使用`mkdir` 命令创建了新目录`dir1`,并使用`cp` 、`mv` 和`rm` 等命令对文件和目录进行复制、移动和删除操作。

(三)进程管理1、查看进程信息使用`ps` 和`top` 命令查看系统中正在运行的进程信息,包括进程 ID、CPU 使用率、内存占用等。

2、进程控制使用`kill` 命令终止指定的进程,使用`nice` 和`renice` 命令调整进程的优先级。

(四)系统监控1、系统性能监控使用`vmstat` 、`iostat` 和`sar` 等命令监控系统的 CPU 、内存、磁盘 I/O 等性能指标。

linux-实验报告6-Apache

linux-实验报告6-Apache

《Linux网络管理》实验报告6实验名称Apache服务器的搭建和使用实验目的与要求:1、掌握Apache的搭建方式;2、掌握虚拟主机的配置方法(基于主机名、基于端口、基于IP地址)3、掌握LAMP的搭建方法;实验内容1、Apache的搭建;2、虚拟主机的配置;3、LAMP的搭建;实验步骤:一、Apache的搭建。

1、实验拓扑结构2、安装Apache服务器。

首先查询apache服务组件是否被安装,使用如下命令:[root@localhost ~]# rpm -aq | grep httpdhttpd-2.2.3-43.el5.centos,出现以上内容,则表明系统已经安装了Apache软件包。

如果系统未安装Apache,则使用root系统用户使用如下进行安装。

[root@localhost CentOS]# rpm -ivh httpd-2.2.3-43.el5.centos.i386.rpm3、启动Apache服务器。

使用如下命令对Apache服务器进行操作:[root@localhost ~]# service httpd start //启动Apache服务器[root@localhost ~]# service httpd restart //重启Apache服务器[root@localhost ~]# service httpd stop //停止Apache服务器[root@localhost ~]# service httpd status //查看Apache服务器的状态4、测试Apache服务器是否正确安装。

2、实验环境搭建a、根据实验拓扑图,配置LAMP服务器和LAMP客户端的网络,使两台计算机之间能够连通。

b、在LAMP上面配置DNS服务器,使其能够解析的地址。

3、实验步骤。

a、搭建Apache服务器。

默认情况下,Apache服务器组件已经被安装到了系统中,可在终端命令窗口中执行如下命令查看是否被安装。

linux操作系统实验报告

linux操作系统实验报告

linux操作系统实验报告Linux操作系统实验报告一、引言在计算机科学领域,操作系统是一种非常重要的软件,它负责管理计算机硬件和软件资源,提供用户与计算机之间的接口。

Linux操作系统是一种开源的、免费的操作系统,它具有高度的可定制性和稳定性,因此在科研、教育和商业领域都得到广泛应用。

本实验报告将介绍我们在课程中对Linux操作系统的实验内容和实验结果。

二、实验目的本次实验的目的是让我们学生通过亲自操作和实践,深入了解Linux操作系统的特点、功能和使用方法。

通过实验,我们将学会如何安装Linux操作系统、使用Linux命令行界面、管理文件和目录、配置网络和安全等。

三、实验环境我们使用的实验环境是一台配置较高的个人计算机,该计算机上安装了虚拟机软件。

我们选择了一款常用的虚拟机软件VirtualBox,并在其上安装了Ubuntu Linux操作系统。

四、实验内容1. Linux操作系统安装我们首先学习了如何在虚拟机上安装Linux操作系统。

通过下载Ubuntu的镜像文件,并创建虚拟机实例,我们成功地完成了Linux操作系统的安装。

在安装过程中,我们需要设置用户名、密码和网络配置等信息。

2. Linux命令行界面Linux操作系统的命令行界面是其最基本的用户接口。

我们学习了一些常用的Linux命令,如cd、ls、mkdir、rm等,用于管理文件和目录。

我们还学习了如何使用管道和重定向符号来处理命令的输入和输出。

3. 文件和目录管理Linux操作系统以文件和目录的形式来组织和管理数据。

我们学习了如何创建、复制、移动和删除文件和目录。

我们还学习了如何修改文件和目录的权限和所有权。

4. 网络配置在现代计算机网络中,网络配置是非常重要的一部分。

我们学习了如何配置Linux操作系统的网络设置,包括IP地址、子网掩码、网关等。

我们还学习了如何使用ping命令测试网络连通性。

5. 安全配置在网络环境中,安全性是一个重要的考虑因素。

Linux报告

Linux报告

L i n u x验报告 实实验内容:VIM配置IDE班级:软件114 学号:201100834418 姓名:赵阳阳Linux的实验报告:关于VIM的IDE的配置一、实验目的: 1.简单配置VIM,使用可以更好的进行编程; 2.使用配置环境,进行编程; 3.理解Linux下用VIM编程的好处,学习使用Linux。

二、实验内容:通过配置VIM的插件,及相应的.vimrc的内容来实现VIM的编程环境构建。

插件自己任选。

三、基本信息: 1.个人信息: 班级:软件114; 学号:201100834418;姓名:赵阳阳 2.系统信息: ubuntu-12.04.1-dvd-i386系统。

四、实验步骤: 1.安装VIM由于个人装的是DVD版本的系统,已集成VIM;其他电脑可以终端使用sud o apt-get install vim来进行安装vim,对于vim的简单使用可以在终端:vimtutor来学习vim的简单使用。

另外还需要安装exuberant-ctags,和vim-doc。

以后有用。

 2.安装gcc,g++编译器终端:sudo apt-get install gccsudo apt-get install g++sudo apt-get update3.介绍一些路径 ~./vim/plugin~/.vim/doc~/.vim/syntax如果没有这些,自己创建; 注意:本文所指.vimrc均指~/.vimrc文件。

4.配置过程: (1)简单的配置: 语法高亮的配置: 新建~/.vim/syntax/c.vim文件内容如下:.vimrc文件的内容:if has("syntax")syntax on " 语法高亮endifcolorscheme ron " elflord ron peachpuff default设置配色方案,vim自带的配色方案保存在/usr/share/vim/vim72/colors目录下" detect file typeiletype onfiletype plugin on" If using a dark background within the editing area and syntax highlighting " turn on this option as wellset background=dark" Uncomment the following to have Vim jump to the last position when" reopening a fileif has("autocmd")au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif"have Vim load indentation rules and plugins according to the detected filetype filetype plugin indent onendif" The following are commented out as they cause vim to behave a lot" differently from regular Vi. They are highly recommended though."set ignorecase " 搜索模式里忽略大小写"set smartcase " 如果搜索模式包含大写字符,不使用 'ignorecase'选项。

Linux插件框架实验报告之欧阳数创编

Linux插件框架实验报告之欧阳数创编

电子科技大学创作:欧阳数学垄於老:孝纟:爲尊券帰:広彫他圭:A2-412 空哲时向:2012.01.04 -、空彫資老徹:Linux坯俺爲爼编繹空鉛窒、修哲境0老敘:三、空捋学吋:4学时加、空%©的:学习知空跋筋付柜冬的科岌。

理餡爲僻的工仔应理,为逬一步科岌禽可用,禽复多废的爛付幻下基础。

1、俊用为鸟縫堆痔空珈幻印功能:科岌一个04 ,角修舉幻印“Hello World” ;衣彳唾新徭蒔羅孩虜襁厚的希摆下,将幻印的殳字改筠“Hello China”。

2、俊用为鸟縫堆痔空珈仓宝义幻印功能:同时雯幻印"Hello World",如"Hello China",皇至同时鬥印未来才舍憎加的典他幻印传倉,才^卩传倉的縫墟痔聂復一个慟宝©杲中,遍厉世个©录,荻取两侖才了印未来的速峻传念,也不能唾新编译統堆庫終厚。

3、1)遏过命今紂方式:./a.out help,鏑出两侖爲需宓呢的功能ID,以氏该功能ID対应的功能堀述。

2)逼过命今紂方式:./a.out FuncID,涸用典体幻印功能(备个福需导出GetID堆0 )。

4、将爲件导出的Print. GetID, Help三个晶敌孜移一个坯中,主終厚需農僅用纟个窍器分别佟存速歧也班的锻,征篦付夕卜部获取倾売的对參。

傢合依勺:空珈一个及付务俊,该务俊可对乞付逬的俊皆分朽。

完竜対殳需逬紂什£样的俊针分朽,禺论用户仓乙也彳经保怡樂,©希□知适雷殳俊诂殳付的矽敌。

也就昱後,本获僻务俊烤全随时而临,f曾走公付俊诂新功能的难趣。

褚倨合本空鉛内寡,省站并虫现速样一个而角殳僻俊皆功能的爛件务俊。

(需殳宜视的据件包站:俊讨宴个殳付的矽騷,俊讨宴个公需的字节騷)六、◎笏乡眾:04 1:A.h:extern "c" void f();a2.cpp:#include<iostream>#include M a.h Husing namespace std;void f(){cout « "hello,China!" « endl;}Al.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 «H dlopen error11 « endl;return 0;}typedef void (*Fun)();Fun fl = (Fun)dlsym(handle, 'T');if(0 ==fl){cout «n fl error n « endl;char *str = dlerror();cout « str « endl;}dlclose(handle);return 0;}襁厚迄&辖采矗囹1所云:© 1:字笛的壷滋04 2:Al.cpp: #include<iostream> using namespace std; extern n C H 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(,7root/test/test4/plug2/plugin/n);while((ptr=readdir(dir)) !=NULL){if ((strcmp(ptr->d_name/..n)==O)ll(strcmp(ptr- >d_name,u. H)==0)){continue;}sprintf(path,"/root/test/test4/plug2/plugin/%s n, ptr- >d_name);void ^handle = dlopen(path, RTLD_LAZY);if(0 == handle){cout «H dlopen error11 « endl;return 0;}typedef void (*Fun)();Fun pf = (Fun)dlsym(handle, 'T');if(0 == pf){cout « "pf error11 « endl;char *str = dlerror();cout « str « endl;return 0;}dlclose(handle);closedir(dir);}襁厚迄&辖采矗囹2函孑:© 2:福僻的遍彷04 3:al.cpp:#include <iostream>using namespace std;const int FUNC_ID = 1;extern ”C” void7(){cout «”Hello World!n « endl;}extern "C" void Help(){cout «n Function ID ” « FUNCJD «”: This function prints Hello World.'1 « endl;}a2.cpp:#include <iostream>using namespace std;const int FUNC_ID = 2;extern ”C” void7(){cout « "Hello China!" « endl;}extern "C" void Help(){cout « "Function ID ” « FUNC」D « " This function prints hello china." « endl;}CPluginEnumerator.cpp#include M CPluginEnumerator.h H#include <dirent.h>#include <string.h>#include <iostream>#include <stdio.h>CPluginEnumerator::CPluginEnumerator(){}CPluginEnumerator::-CPluginEnumerator(){}boolCPluginEnumerator::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, H.H) ==O)ll(strcmp(ptr->d_name, ”•・”)=0)) continue; char path[260];sprintf(path, '7root/test/test4/plug3/plugin/%s H,ptr- >d_name);vstrPluginNames.push_back(path);}closedir(dir);return true;}Test.cpp:#include <dlfcn.h>#include <iostream>#include M CPluginEnumerator.h 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[l], "help") == 0){vector<string> vstrPluginNames; CPluginEnumerator enumerator;if(!enumerator.GetPluginNames(vstrPluginNames)) { cout «n GetPluginNames error11 « endl;return 0;}for(int i = 0; i< vstrPluginNames>size(); i++){void ^handle = dlopen(vstrPluginNames[i].c_str(),RTLD_LAZY);if(handle == 0){cout «H dlopen error11 « endl;return 0;}typedef void (*FUNC_HELP)();FUNC.HELP dl_help = (FUNC_HELP)dlsym(handle, ” Help”);if(dl_help == 0){cout «H dlsym error11 « endl; return 0;}(dl_help)();dlclose(handle);else if(strcmp(argv[ 1 ],M1rt) == 0)sprintf(path, ,7root/test/test4/plug3/plugin/%s f\ H aLso n); void ^handle = dlopen(path, RTLD_LAZY);if(handle == 0){cout «H dlopen error11 « endl;return 0;}typedef void (*FUNC_PRINT)();FUNC_PRINT dl_print = (FUNC_PRINT)dlsym(handle, T);if(dl_print == 0){cout «H dlsym error11 « endl;return 0;dlclose(handle);}else if(strcmp(argv[l], "2") == 0)// 得到第二个func 的参{sprintf(path, '7root/test/test4/plug3/plugin/%s n, "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 «H dlsym error11 « endl;return 0;dlclose(handle);}return 0;}襁厚迄矽辖采辰囹3函孑:© 3:強付鏑出04 4:CPluginEnumerator>h:#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include <vector>#include <string>using namespace std;class CPluginEnumeratorCPluginEnumerator();virtual 〜CPluginEnumerator();boolGetPluginNames(vector<string > &vstrPluginNames);};# endifCPluginEnumerator>cpp:#include n CPluginEnumerator.h H#include <dirent.h>#include <string.h>CPluginEnumerator: :CPluginEnumerator(){}CPluginEnumerator: :-CPluginEnumerator(){}boolCPluginEnumerator: :GetPluginNames(vector<string >& vstrPluginNames)DIR *dir = opendir(n7plugin n); 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 = H ./plugin/11;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 FunctionlD); private:std::vector<void *> m_vhForPlugin;std::vector<IPrintPlugin*> m_vpPlugin; };#endifCPluginControllencpp#include "CPluginController.h"#include M CPluginEnumerator.h H#include "IPrintPlugin.h"#include "dlfcn.h"CPIuginController::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,H CreateObj n);if(NULL != CreateProc){(CreateProc)(&pPlugin);if(pPlugin != NULL){ m_vpPlugin.push_back(pPlugin);return true;}bool CPluginController::ProcessRequest(int FunctionlD) {for(unsigned int i = 0; i < m_vpPlugin>size(); i++){if(m_vpPlugin[i]->GetID() == FunctionlD){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,H CreateObj n);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()Functionxpp#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!H « endl;}virtual void Help(){cout « "Function ID " « FUNC」D «” : This function will print hello world.n « endl;}virtual int GetlD(void){return FUNCJD;extern M C n void CreateObj(IPrintPlugin **ppPlugin) { static CPrintPlugin plugin;*ppPlugin = & plugin;}functionlecpp#include <iostream>#include "IPrintPlugin.h"using namespace std;const int FUNC」D = 2;class CPrintPlugin : public IPrintPlugin { public:CPrintPlugin(){}virtual 〜CPrintPlugin(){}。

Linux插件框架实验报告

Linux插件框架实验报告

电子科技大教之阳早格格创做真验报告教死姓名:教号:指挥西席:真验天面:A2-412一、真验室称呼:Linux环境下档编程真验室两、真验名目称呼:插件框架真验三、真验教时:4教时四、真验手段:教习战试验插件框架的启垦.明白插件的处事本理,为进一步启垦下可用,下搀纯度的插件挨下前提.五、真验真质:1、使用动背链交库真止挨印功能:启垦一个步调,背屏幕挨印“Hello World”;正在没有沉新编译链交共时要挨印“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()#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()#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;}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;#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){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;(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::#ifndef CPLUGINENUMERATOR_H#define CPLUGINENUMERATOR_H#include <vector>#include <string>using namespace std;class CPluginEnumerator{public:CPluginEnumerator();virtual ~CPluginEnumerator();bool GetPluginNames(vector<string>& vstrPluginNames);#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;}#ifndef CPLUGINCONTROLLER_H#define CPLUGINCONTROLLER_H#include <vector>class IPrintPlugin;class CPluginController{public:CPluginController(void);virtual ~CPluginController(void);bool InitializeController(void);bool ProcessRequest(int FunctionID);private:std::vector<void *> m_vhForPlugin;std::vector<IPrintPlugin*> m_vpPlugin;};#endif#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);}}}}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;}#pragma onceclass IPrintPlugin{public:IPrintPlugin();virtual ~IPrintPlugin();virtual void Help() = 0;virtual void Print() = 0;virtual int GetID() = 0;};#include "IPrintPlugin.h"IPrintPlugin::IPrintPlugin(){}IPrintPlugin::~IPrintPlugin(){}#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 helloworld." << endl;}virtual int GetID(void){return FUNC_ID;}};extern "C" void CreateObj(IPrintPlugin **ppPlugin) {static CPrintPlugin plugin;*ppPlugin = &plugin;}#include <iostream>#include "IPrintPlugin.h"using namespace std;const int FUNC_ID = 2;class CPrintPlugin : public IPrintPlugin{public:CPrintPlugin(){}virtual ~CPrintPlugin(){}virtual void Print()。

  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下插件开发的多种方法,尤其是综合试验中,对于插件的安装。

相关文档
最新文档