第一篇:arcgis上机实习报告
课程实习报告
实习课程:《ArcGIS专业技能训练实习报告》
姓
名:
学
号:
专
业:
班
级:
2012年 6月
20日
ArcGIS专业技能训练实习报告
实习目的:
通过学习Arcgis这款Gis应用软件熟练我们的实际应用能力,深入理解GIS软件应用的核心部分,通过熟练Arcgis能掌握类似相关软件操作,加强动手能力。
实习步骤:
1.对Arcgis软件整体掌握,并与之前各类软件操作对比和学习。
2.具体对软件操作掌握空间数据的采集与组织、数据的处理与变、数据的可视化表达。
3.Arcgis的空间分析能力的掌握:矢量数据的空间分析、栅格数据的空间分析、三维分析、地统计分析、水文分析等。4.掌握Arcgis的空间分析建模。
实习内容:
根据练习内容,选择了练习第3、4、5、7、12章的内容,其余在课下自己练习完成,这些章内容分别为:空间数据的采集与组织、数据的处理与变换、数据的可视化表达、矢量数据空间分析、空间分析建模
Geodatabase是一种采用标准关系数据库技术来表现地理信息的数据模型。Geodatabase支持在标准的数据库管理系统(DBMS)表中存储和管理地理信息。一. 基于Geodatabase的数据库设计
Geodatabase支持面向对象的矢量数据模型,它将地理数据组织成一个数据对象的结构体系。在Geodatabase模型中,实体被表示为属性,行为,关系的对象。Geodatabase还允许用户定义对象之间的关系,以及保持对象之间参照完整性的规则。Geodatabase也定义了简单的对象,地理要素,几何网络,注记要素等多种对象类型。二. Geodatabase中的信息类型
1.表(table):是记录的集合,每个记录(行)中包括许多列(字段);
2.对象类(object classes):对象表示一个没有空间几何的实体,没有位置相关信息,但是可以通过关系类与要素联系起来,一个对象类作为一个表存储在Geodatabase中,一个对象是表中的一行。3.要素类(feature classes):表示有空间几何的实体,有位置相关信息。要素类是具有相同的属性和相同的几何表示类型的要素集合。1)简单要素类:没有拓扑关联,包括点,线,多边形,注记等多种类型,以要素的方式管理,存放在要素集内外均可。
2)复杂要素类则是有拓扑关联的若干个要素类的组合,必须存放在同一个要素数据集中,例如拓扑要素、几何网络等类型。
4.子类(subtype):在要素类内部可以划分若干个次一级的组,每个组是一个子类。每个子类有其自己的完整性规则和GIS行为。5.要素数据集(feature database):要素数据集是一个具有相同空间参照的要素类的集合。
6.关系(relationships):是一种表(或要素类)与表(或要素类)之间的联系机制。关系类建立在对象(或要素)类之间,由一个对象(或要素)类指向另一个对象(或要素)类。
7.栅格数据集(raster data sets):影像作为栅格表来管理。
8.拓扑关系(topology):拓扑关系将参与拓扑的各个要素类集成在一个拓扑图中作为一个拓扑单元来管理,规定同一个要素类中的各个要素如何与其他要素共享几何或不同要素类之间如何共享几何。9.元数据:对数据库中各个数据元素的描述。
10.几何网络(geometric network):若干个要素类作为一个整体参与到几何网络的构造,Geodatabase通过拓扑关联保证参与到几何网络中的各个要素类的空间几何的连通性。几何网络将导致保证网络连通性的行为。
三. Geodatabase的优势:
1.所有图形数据和属性数据统一存储在商业DBMS中。
2.便于使用DBMS支持的多用户并发访问、事务管理、失败事务恢复、用户权限策略等机制,有利于空间信息共享、数据安全,提高了数据库性能。
3.支持智能化的要素、规则和关系。4.完善的用户支持。
四.Geodatabase数据库设计的内容
1.基本内容是规定 构成数据库的要素类、栅格数据集、其他表,以及表之间的各种关系。
2.其中,要素(或对象)类之间的关系通过要素数据集、关系类、拓扑来管理。
3.一个要素数据集中的各个要素类具有相同的空间参照;拓扑类、几何网络中的要素类受拓扑完整性约束。五
Geodatabase数据库设计的步骤
1.用户视图建模 2.定义实体和关系 3.明确实体的表示 4.匹配到Geodatabase模型 5.组织地理数据集
六.将地理实体表示为Geodatabase数据类型
要在识别地理实体并决定其几何表示类型之后,决定数据如何在Geodatabase中表示。具体包括两方面处理:
1.决定各种地理实体的表示类型及其拓扑关系; 2.决定各实体的属性字段。
决定实体的表示类型的依据是其几何表示类型:点实体用点要素、简单节点、复合节点表示,线实体用线要素、简单边、复合边表示,面实体用多边形要素表示,表面实体用TIN或栅格数据集表示,空间位置无关的实体用对象(表)表示。
其中点、线、面实体的离散分布有两种:
1.独立分布的实体,与其他要素无关,可以表示为简单的点、线、面要素;
2.与其他要素的分布相关,这种点、线实体可以表示为节点、边要素,面实体表示为有拓扑关系的多边形要素。
考虑要素之间的拓扑关系,定义复合要素类:平面拓扑和几何网络。平面拓扑强制保证要素不能相互交叉而没有交点。如土地或区划系统,采用平面拓扑管理要素间的公共边。
几何网络强制保持网络要素之间的连通性,是网络编辑易于操作。如对于线状系统,交通网络,多采用几何网络表示。 确定对象的属性类型
1.主要依据要素(或对象)的专题性质而定。
2.每个实体可能有多种属性,依据相关原则确定每种属性(字段)的数据类型,使用默认值、域等工具保证数据的完整性。六. 将数据组织到Geodatabase地理数据集
1.工作包括:
(1).划分要素类和子类(2).规定要素类的拓扑关系(3.)构建地理数据集(4.)组织地理数据库
(1)划分要素类和子类
下列情况下必须建立单列的要素类:
1)当各组相关要素的属性字段组合根本不同时 2)当各组相关要素需要有特有的定制行为时 3)当需要对各组要素赋予不同存取权限时
4)当有些要素要采用版本管理存取而另一些要素不需要版本管理时(2)规定要素类的拓扑关系
1)将相关要素分组为几何网络好或平面拓扑
2)如果要素类是独立点、线、面要素,那么它不参与几何网络或者平面拓扑
3)如果要素类是简单边、简单节点、复合边、复合节点,那么它参与几何网络的构成
4)如果要素类是拓扑关联的多边形要素类,其内部各个要素必须满足特定的拓扑关系(3)构建地理数据集
1)要素数据集是一个容器,使用它可以将相似的要素类组合在一起。2)将具有相同空间参照的要素类组织到同一个要素数据集中是有利的,因为不同要素数据集在运算过程中可能会出现细微的差别而引起数据不一致。3)同时参加到平面拓扑或几何网络中的各个要素类必须被组织到同一个要素数据集中。
(4)最后将要素数据集和要素类组合起来。
1)确定了各要素及其拓扑联系之后,最后需要将它们组合到地理数据库中。2)如果企业用户包括多个部门,不同部门使用不同的数据集。地理数据库可以安装企业组织结构部署。
4)如果使用personal Geodatabases,由于数据库容量的限制,必须对数据库按专题或空间进行分割。七. Geodatabase的建库步骤
1.在F盘中建立自己的文件夹070141; 2.在自己的文件夹中建立个人数据库database;截图说明
3.在personal database中建立点要素a,线要素aa,面要素aaa。八. Geodatabase的拓扑建立
若干个要素类作为一个整体参与到几何网络的构造,Geodatabase通过拓扑关联保证参与到几何网络中的各个要素类的空间几何的连通性。几何网络将导致保证网络连通性的行为。
1.右键单击数据库database,点击new再点击Feature Dataset
截图说明:
出现对话框New Feature Dataset 在name中填写名字topology;2.点击“下一步”出现如下对话框,点击对话框中的Import,又出现对话框在Ext文件夹中点击Blocks.shp,点击Add即可添加数据;
截图说明;
再点击继续点击下一步,下一步,Finish,即可建立topology; 3.右键单击topology,点击Import,再点击Feature Class(mulitiple)
截图说明:
出现如下对话框,在对话框中点击第一个图标浏览,在出现的对话框中加入Ex1中的两个数据Blocks.shp和Parcels.shp,点击Add;
点击ok,则topology中增加了Blocks.shp和Parcels.shp两个数据项; 4.右键单击topology中的Blocks,点击Properties 截图说明:
出现如下对话框, 在对话框中的子类SubtypeField一栏下拉选择Res,在Subtype中设置Code和Description为0,nonres;1,res; 点击确定;
截图说明:
4.同理设置Parcels的Properties;
5.右键单击topology,点击new,再点击Topology:
6.在出现的如下对话框中点击下一步
7在.出现的如下对话框中点击下一步
8.在出现的New Topology如下对话框中点击Select All 截图说明:
9.在出现的New Topology如下对话框中,在Enter the number of ranks中填1;
10.点击下一步,在出现的New Topology对话框中,点击Add Rule,再Add Rule中的三栏中选择Parcels,Must Not Overlap With,Blocks,点击ok; 截图说明:
点击下一步,再点击Finish.再出现的对话框是否拓扑查询,点击否。则在Topology中建立了topology-Topology。
11.打开ArcMap,将topology-Topology拖到ArcMap的Layers中,则在Layers中添加了topology-Topology,Blocks和Parcels; 截图说明:
12.点击工具栏中的View,点击Toolbars,再点击Topology,将出现进行拓扑操作的Topology工具栏;在Editor下拉菜单中点击Starting Editor,将工具激活;
截图说明:
13.点击Topology工具栏的Topology Editor Tool图标,双击弧线段,在结点处进行操作即可
拓扑结果图:
第二篇:ArcGIS上机心得体会
ArcGIS上机心得体会
持续了七周的ArcGIS上机实验终于告一段落了!七个星期的时间说长也挺短的,可在这6个周四里(其中清明放假一次),我们却完成了8个上机实验,这是之前所预想不到的。俗话说“实践是检验真理的唯一标准”,任何知识都只有通过认真的实践才能掌握得更好。这次的上机实验使我的专业素养得到了极大的提升,对自我的创新精神和实践能力的提高起了及其重要的作用。
总体上来说,这几次上机实验课是我至今的上机实验课中上得最为认真,最为紧张的课!当然原因有很多,仔细回想一下,做了一下几点总结:
(1)对软件的熟悉程度不够。虽然以前接触过这款软件,但操作时都是照着老师给的教程按部就班的做,没有融入自己的思考,更没有提出自己的看法,就只是麻木似机器般的完成着老师布置的任务,效果可想而知了--十分不好。而当我们一旦离开了教程,需要我们自己去探索去思考时,我们便开始紧张了。因而速度也慢了下来,效率自然也变得低下。可换个角度想,老师要求严格又何尝不是一件好事呢?虽然短期的效率低下,但从长远的角度看,我们得到了真正的锻炼,对这门知识的理解,掌握,消化会更深刻,更彻底。
(2)踏实才是最好的学习态度。此次的上机实验,所用的数据很多都是环环相扣的,只要哪一步出错,后面就无法继续进行下去,以至于最后得不到自己想要的结果。所以,这让我更加深刻的认识到了我们做任何事都不能太过于急于求成,在摆正好自己的心态前提下,我们需要踏踏实实,稳扎稳打,才能将一件事做好。而且,在遇到问题的时候,我们必须正视它并以积极乐观的心态去面对,相信只要自己勤动脑,肯动手,多探索,就没有什么会是弄不懂的。
(3)这次上机实验并不是单独的掌握好这款软件的基本功能就能很好的完成作业,还需要运用到其他知识,因此,学习知识的宽度与深度同等重要。比如:这次的上机实验多次用到excel表格计算,还需要进行矩阵计算,这就是对我们其他方面知识的一个考验。
最后我要非常感谢能有这次上机实验机会,更要感谢任课老师的负责,让我的各方面能力都提升了那么多!
第三篇:ARCGIS实习报告
《ArcGIS实习报告》
学
号:
班级序号:
姓
名:
指导教师:
成
绩:
ArcGIS软件操作实习报告
实习目的:
通过学习Arcgis这款Gis应用软件熟练我们的实际应用能力,深入理解GIS软件应用的核心部分,通过熟练Arcgis能掌握类似相关软件操作,加强动手能力。
实习过程:
1.对Arcgis软件整体掌握,并与之前各类软件操作对比和学习。
2.具体对软件操作掌握空间数据的采集与组织、数据的处理与变换、数据的可视化表达。
3.Arcgis的空间分析能力的掌握:矢量数据的空间分析、栅格数据的空间分析、三维分析、地统计分析、水文分析等。4.掌握Arcgis的空间分析建模。
实习内容:
根据学习内容,我们选择了《地理信息系统分析与应用》第三章作为实习内容,本章内容分别为:初识ArcGIS、农田保护区域分析、度假村选址、屏幕矢量化及拓扑建库、投影转换及图形裁剪、注记及属性编辑与连接、燕麦试验田选址、商店选址评价、土壤肥沃度分析、统计图表、网络分析、ArcGIS中DEM 的建立及应用。
以下是实习内容截图
3.1 初识ArcGIS 1启动ArcCatalog
2.在arcmap 中加载数据
3.图层操作
(1)放大、缩小
4、改变drelief图层的显示图例
6.改变dsoils图层的显示图例
3更改地图显示比例尺
4、将ArcCatalog 右侧窗口中的Water Use 图层拖到 ArcMap 中。
3.2农田保护区域分析
3.2.1 问题和数据分析
1.问题提出
有一块受洪水影响的地区。政府为了保护土地,决定在河流北岸建一个水坝。我们的任务是找出水坝保护的农田范围。
3.2.2连接并添加数据
1.连接并添加数据,并改变dsoils
和
drelief 图层的地图符号。
3.1.5 找出洪水淹没区域
在本例中我们需要找出所有高程低于8米的区域。利用
栅格计算器(Raster
112
3.1.6 寻找可耕种区域
3.1.7 确定水坝保护的可耕种区域
314
3设置地图单元
516 选择记录 为area 字段赋值
718
2将选中区域保存为一个新图层
920
4.122
3重分类
4查看重分类结果
324
3.3.4 确定坡度小于3%的区域
1添加图层 2求取坡度 3图层显示 4统计坡度分布 5 取出失真坡度数据 6提取坡度小于3%的地区 7重命名
3.3.5 提取年平均温度高于 16.5 摄氏度 的区域
526
3.4屏幕矢量化及拓扑建库
添加了控制点
将CropLine图层设定为编辑状态
数字化
728
3.5投影转换及图形裁剪
3.5-5 裁剪结果 CropCov
930
3.7 燕麦试验田选址
3.7-5 加载roads 和 hydro 特征类
3.7-28 计算地块总价
3.8 商店选址评价
3.8-11 设置重分类边界值
132
3.9-19 建立一个标准差圆
3.10 统计图表
3.10-8 趋势线
334
3.12 ArcGIS 中 DEM 的建立及应用
3.12-4 离散点生成的DEM
3.12-12 离散点生成TIN
536
3.12-31 坡度图
3.12-34 曲率图
3.12-37 坡向图
738
3.12-45 可视域图
3.12-49 统计计算结果
940
实习心得体会
在这次软件操作实习中,我们按照课本的指导,亲自体验了如何用ArcGIS实现数据的采集与组织、数据的处理与变换、数据的可视化表达。空间分析能力、矢量数据的空间分析、栅格数据的空间分析、三维分析、地理统计分析、水文分析等。
在一个个案例与任务中。我们熟悉了软件的操作,软件可以实现的功能,了解到了gis可以帮助我们解决生活中哪些方面的问题。这使课堂理论与实际紧密联系,帮助我们更好地理解了GIS知识。在软件的使用过程中,我们训练了自己解决实际工程任务的能力,提高了专业技能。这对将来走上工作岗位也有很大的帮助。此外,通过实际操作,书本的知识不再枯燥乏味。在制作一幅又一副功能各异的图片,完成书本要求的内容中。我们收获了成功的喜悦,惊叹于GIS的强大功能,这使我们对GIS更加感兴趣。
地理信息系统为测绘人员提供了一个一体化工具,使我们可以将各种格式和来源的数据整合在一起,进行维护和管理、使用动态地图来可视化数据、关联信息。这不仅让我们更好的管理和分配资源,还可以进行建模和分析工作,使原始数据产生更为广阔的价值。因此要成为一名优秀的测绘工作者,除了要熟练操作仪器,掌握各类工程测量的方法外,还应该将熟练运用常见的GIS软件,借助GIS的强大功能为我们的工作、生活创造更多的幸福。
中国地质大学信息工程学院
2011年 12 月28日
1-41
第四篇:ARCGIS 实习报告
Arcgis 实习
第 二 次 实习报 告
班级:地信121 姓名:闻元武 学号:201201694 空间数据管理及属性编辑
一. 实验目的
1.利用ArcCatalog管理地理空间数据库,理解personal Geodatabase空间数据库模型有关概念。2.掌握在ArcMap中编辑属性数据的基本操作。3.掌握根据GPS数据文件生成适量图层的方法和过程。4.理解图层属性表间的连接(join)或关联(Link)关系。二. 实验要求
1.阐述基本原理和概念(要素类,要素数据集)。2.Geodatabase空间数据库模型的特点。
3.1:M 空间查询的实现原理及应用实例。比较连接(Join)和关联(Link)关系的区别和应用。三. 实验内容
1.启动 ArcCatalog 打开一个地理数据库 1.1当ArcCatlog打开后,连接到指定文件夹Exec2.1.2 打开个人空间数据库——National,mdb。可以看到在National,mdb中包含有2个要素数据集,一个关系类和一个属性表。
2.预览地理数据库中的要素类
2.1 ArcCatlog窗口右边的数据显示区内,点击“预览”选项切换到预览视图界面。在目录树中,双击数据集要素集- WorldContainer,点击要素类-Container94激活它。
2.2 在2.1窗口的下方,预览下拉列表中选择“表格”,现在你可以看到 Countries94 的属性表。查看它的属性字段信息。
2.3 在目录树下面,选择WorldCities。查看他的属性信息。
3.创建缩图,并查看元数据 3.1 在目录树中,选择地理数据库National中的要素类-Countries94,切换到“预览”视图,点击工具栏上的“放大镜”按钮,将图层放大到一定区域,然后再点生成并更新缩略图。这时,切换到“内容”视图界面下,并在目录树中选择要素集——WorldContainer数据查看方式更改为缩略图方式。注意此时,要素类的缩图图是不是发生了改变。缩略图已经不是原来的缩略图,而是放大之后的图片。
3.2 点击“元数据”选项页,查看当前要素类的元数据,了解当前要素类是采用什么坐标系,都有哪些属性字段,字段的类型等信息。在元数据工具栏中,从样式表中选择不同的样式,可以看到,元数据显示的格式发生了变化。4.创建个人地理数据库(Personal Geodatabase-PGD)4.1 创建个人地理数据库(Personal Geodatabase-PGD)。
4.2 在ArcCatalog的目录树中,定位到D:盘,右键点击这
D:盘,在出现的菜单中,选择[新建]>>[文件夹],文件夹名称改为 “myGeoDB”。右键选中这个文件夹,在出现的菜单中,点击[新建]>>[个人地理数据库],这会创建一个名称为:“新建个人地理数据库” 的数据库文件,将之改名为“YN.mdb”。
4.3 右键点击数据库文件“YN.mdb”,在出现的菜单中,选择[导入]>>[要素类multiple],在出现的对话框中,打开要导入要素:县界 prj.shp/县城 prj.shp/道路 prj.shp(这些文件在 Exece2 文件夹下,按住Shift键并点击鼠标可同时选择多个 Shape文件)。
4.4 右键点击数据库文件“YN.mdb”,新建【要素集】,并围棋指定坐标系。
4.5 右键点击新建的要素集-KM,在出现的菜单中选择[新建]>>[要素类],在出现的对话框中输入要素类的名称-公交站点,点击<下一步>,再次点击<下一步>按钮。在出现的对话框中选择字段,修改字段的几何类型为“点”(表示此要素类中将要存储的要素类型是点要素,准备用来存储公交站点),点击下一步,我们添加两个字段“站点名称”,“公交站点编号”数据类型都设置成“文本”,点击“完成”按钮。
4.6 新建数据表:右键点击地理数据库-YN.mdb,在出现的菜单中,选择[新建]>>[表],输入“表”名称为“公交线路”,点<下一步>,再次点<下一步>,在对话框中,新添加两个字段
公交站点编号、公交线路(数据类型都设为“文本”),点击“完成”。
4.7 创建公交站点到公交线路一对多的关系(1:M):右键选择地理数据库-YN.mdb,在出现的菜单中选择<新建>-<关系类>,对以下内容进行设定,其它设置接受默认选项。选择关系类型为一对多关系,这样可以建立公交站点到公交线路一对多的关系,因为经过一个公交站点的公交线路有多条,这样,在我们从公交站点分布图是查询某个公交站点时就可以查询经过这个站点所有公交线。
4.8 完成以上步骤后,在ArcCatlog中就可以看到,在地理数据库YN.mdb中,有一个有一个要素集(NewKM),其中包含一个要素类(公交站点)、一个数据表(公交线路)、一个关系类(公交线及公交站 1:M)
5.拖放数据到 ArcMap 中
5.1 启动ArcMap,新建一个空的地图文档,通过拖放的方式添加上面所创建的数据到ArcMap 中。在ArcCatalog中,点击“内容”选项页,在目录树中,点击地理数据库-YN.mdb,将要素类-“公交站点”及属性数据表“公交线路”拖放到ArcMap中。
6.编辑属性数据及进行 1:M的空间查询 编辑公交站点,及公交路线。
7.导入 GPS 数据,生成图层
7.1 启动 ArcMap,切换到数据源视图。添加 GPS 数据,选择GPS.txt。
7.2 执行菜单命令:[工具] >>[添加XY 数据],在XY 数据”窗口中,选择已添加的 XY数据表,指定X坐标字段(东经)和Y 坐标字段(北纬),按 GPS 系统采用的坐标系统为WGS_1984。确定后,在地图显示区域中,就会根据GPS 数据文件中采集的坐标信息创建点状的事件图层。
7.3 在图层控制面板(TOC)中,右键选中根据GPS 数据文件生成的事件图层。在出现的菜单中,执行[数据]>>[导出数据]命令,在导出数据对话框中,指定要导出的文件名称及存储位置。这样就完成了由GPS 数据文件生成图层的过程。
四. 实验总结
4.1 通过本次实习,我加深了对要素类概念的理解,要素类就是指具有相同的几何特征的要素集合,比如我们这里的道路的要素类,县城的要素类等。
4.2 通过本次实习,我还知道要素数据集就是一个集合,在这个集合里面,所有的要素类都具有相同的坐标系统。
4.3 Geodatabase 空间数据库模型的特点:Geodatabase在要素类和数据集中对空间参考信息进行了完整的定义。而且,Geodatabase空间几何数据与属性数据保存在同一个同一个要素类中。
4.4 1:M 空间查询的实现原理及应用实例:将两个属性表关联起来,其中一个属性表中的某一记录与另一属性表中多个记录相关联,当查询某一条记录时就可以查询到与其相关联的其他属性。如实验二中,当查询某一公交站点时,可以将通过此站点的公交路线都显示出来,就属于1:M空间查询。4.5 比较连接(Join)和关联(Link)关系的区别和应用: 区别:
连接:连接可以添加额外的属性数据到到当前图层,也可以使用这些额外的属性数据进行标注。关联:关联可以使数据关联到当前图层关联的数据并不像连接那样添加到图层的属性表中,而是在处理图层的属性数据的时候可以获取关联的数据。
应用:
连接:生成虚拟连接(并不修改数据源)虚拟表,适用:一对多,多对一。关联:在表A中选择一个记录,可以关联并同时选择表中多条记录,适用:一对多。
第五篇:linux上机实习报告
目 录
Linux 第一次上机(运行环境RedHat)................................................................................1 调试运行CD唱片应用程序.......................................................................................1 运行过程............................................................................................................1 心得体会............................................................................................................3 编写shell脚本,求1到100的和..............................................................................3 运行过程............................................................................................................3 源代码...............................................................................................................4 编写shell脚本,从键盘输入两个数,求这两个数的和.................................................4 运行过程............................................................................................................4 源代码...............................................................................................................5 等待特定用户登录,每30秒确认一次.......................................................................5 运行过程............................................................................................................5 源代码...............................................................................................................6 找出系统中当前消耗磁盘容量最大的前10个用户,并向他们发送警告邮件...............6 运行过程............................................................................................................6 源代码...............................................................................................................8 查找输入文件的路径.................................................................................................8 运行过程............................................................................................................8 源代码...............................................................................................................9 Linux 第二次上机(运行环境RedHat)................................................................................9 定制自己的ls命令。提供至少三种带参数的执行方式................................................9 运行过程............................................................................................................9 源代码..............................................................................................................11 调试编译串行口通信程序p6.5.c...............................................................................16 运行过程..........................................................................................................16 Linux 第三次上机(运行环境RedHat,CentOS)...............................................................16 创建一个系统监听守护进程,一旦接收到其他进程发来的信号,马上给出报告........16 运行过程..........................................................................................................16 源代码.............................................................................................................18 分别利用本地socket套接字和INTENET套接字实现进程间文件传输......................20 本地socket套接字运行过程.............................................................................20 本地socket套接字服务器server1.c源代码........................................................22 本地socket套接字客户端client1.c源代码.........................................................23 INTENET套接字运行过程...............................................................................25 INTENET套接字服务器server2.c源代码..........................................................28 INTENET套接字客户端client2.c源代码...........................................................29 感谢与收获....................................................................................................................30
Linux 第一次上机(运行环境RedHat)调试运行CD唱片应用程序 运行过程
图表 1第一步,使用./CD 命令运行CD脚本
图表 2进入选项界面
图表 3增加CD
图表 4查找CD
图表 5查询数目
图表 6退出
心得体会
通过运行书上的CD唱片应用程序,进一步地了解到shell编程的方法,以及编写程序的思路。
编写shell脚本,求1到100的和 运行过程
图表 7使用./sum1to100运行
源代码
图表 8使用cat sum1to100查看源代码
编写shell脚本,从键盘输入两个数,求这两个数的和
运行过程
图表 9使用./sumAandB 运行
源代码
图表 10使用cat sumAandB查看源代码
等待特定用户登录,每30秒确认一次 运行过程
已知特定用户是zzx,我首先让root用户登录并运行程序,可以发现每隔30s提醒一次
图表 11使用./checkuser运行
当我切换到zzx用户,并再次运行程序,可得如下结果
源代码
图表 12使用cat checkuser查看代码
找出系统中当前消耗磁盘容量最大的前10个用户,并向他们发送警告邮件 运行过程
由于权限等问题,我们使用root用户运行程序
图表 13使用./mymail运行
运行完毕后,我们就可以查看邮件了
图表 14 root用户收到的邮件
图表 15 zzx用户收到的邮件
图表 16 t1用户收到的邮件
源代码
图表 17 使用cat命令查看
查找输入文件的路径 运行过程
由于权限的问题,我们使用root用户运行程序
图表 18 使用./route运行,并按照要求输入文件名
源代码
图表 19 使用cat route查看源代码
Linux 第二次上机(运行环境RedHat)定制自己的ls命令。提供至少三种带参数的执行方式 运行过程
图表 20 使用./ls 运行不带参数ls
图表 21使用./ls-l 运行带参数-l 的ls
图表 22 使用./ls-a运行带参数-a的ls
图表 23使用./ls-al 运行带参数-al的ls 源代码
#include #include int do_ls(char *dir,char *filename,int lflag){ int n;struct stat buf;char out[100];struct passwd *pw; struct group *gr;struct tm *t;if(lflag == 0){ } { } return 0; printf(“%st”,filename);if(lstat(dir,&buf)<0)fprintf(stderr,“stat error:%sn”,strerror(errno));return-1;switch(buf.st_mode & S_IFMT){ case S_IFREG: printf(“-”);break;case S_IFDIR: printf(“d”);break;case S_IFCHR: printf(“c”);break;case S_IFBLK: printf(“b”);break;case S_IFIFO: printf(“p”);break;case S_IFLNK: printf(“l”);break; case S_IFSOCK: printf(“s”);} for(n=8;n>=0;n--){ if(buf.st_mode&(1< break; } } else { } { case 2: printf(“r”);break;case 1: printf(“w”);break;case 0: printf(“x”);break;default: break;} printf(“-”);printf(“ %d”,buf.st_nlink); pw = getpwuid(buf.st_uid);printf(“ %s”,pw->pw_name);gr = getgrgid(buf.st_gid);printf(“ %s”,gr->gr_name);printf(“ %ld”,buf.st_size);t = localtime(&buf.st_atime);printf(“ %d-%d-%d %d:%d” ,t->tm_year+1900 ,t->tm_mon+1 ,t->tm_mday ,t->tm_hour ,t->tm_min); printf(“ %s ”,filename); if(S_ISLNK(buf.st_mode)){ printf(“-> ”);if(readlink(filename,out,100)==-1){ } //printf(“readlink errorn”); } printf(“%s”,out);} printf(“n”);return 0;int ls_prepare(char *w,int aflag,int lflag){ struct stat buf;char name[100];DIR *dir; struct dirent *pdr;if(lstat(w,&buf)<0){ fprintf(stderr,“stat error:%sn”,strerror(errno));return-1;} if(S_ISDIR(buf.st_mode)){ dir = opendir(w);{ } closedir(dir); while((pdr = readdir(dir))!=NULL)if(aflag==0){ if(pdr->d_name[0]=='.') continue;memset(name,0,100); strcpy(name,w); strcat(name,“/”); strcat(name,pdr->d_name);do_ls(name,pdr->d_name,lflag);}else { } memset(name,0,100);strcpy(name,w);strcat(name,“/”);strcat(name,pdr->d_name);do_ls(name,pdr->d_name,lflag);}else { do_ls(w,w,lflag); } { } } return 0;int main(int argc,char **argv)int aflag =0;int lflag =0;char c;int i;while((c = getopt(argc,argv,“al”))!=-1){ } switch(c){ case 'a': aflag =1;break;case 'l': lflag =1;break;default: break;} if(argc == optind){ ls_prepare(“./”,aflag,lflag);} else { } for(i=optind;i 调试编译串行口通信程序p6.5.c 运行过程 由于权限问题,我们在root用户下运行程序 图表 24 使用./mytrunk不带参数运行 图表 25使用./mytrunk /dev/ttyS0 0带参数运行 Linux 第三次上机(运行环境RedHat,CentOS)创建一个系统监听守护进程,一旦接收到其他进程发来的信号,马上给出报告 运行过程 图表 26首先运行守护进程之后查看 当前进程 图表 27可以发现守护进程-jincheng在后台运行,且 PPID=1,PID=4085 图表 28可以发现守护进程向test.txt发送了start 图表 29向守护进程发送终止信号,终止守护进程 图表 30可以发现后台运行的守护进程没了 图表 31可以发现守护进程又向test.txt发送了end 图表 32具体查看test.txt 图表 33具体查看test.txt的内容 源代码 #include if(sig==SIGTERM){ write(fd1,“endn”,5);exit(0);} } int daemon(int nochdir, int noclose){ pid_t pid; pid = fork(); /* In case of fork is error.*/ if(pid < 0) { perror(“fork”); return-1; } /* In case of this is parent process.*/ if(pid!= 0) exit(0); /* Become session leader and get pid.*/ pid = setsid(); if(pid <-1) { perror(“setsid”); return-1; } /* Change directory to root.*/ if(!nochdir) chdir(“/”); /* File descriptor close.*/ if(!noclose) { int fd; fd = open(“/dev/null”, O_RDWR, 0); if(fd!=-1) { dup2(fd, STDIN_FILENO); } dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if(fd > 2) close(fd); } umask(0027); return 0; } int main(void){ fd1=open(“test.txt”,O_RDWR | O_TRUNC); } write(fd1,“startn”,7);daemon(0,0);signal(SIGTERM,sigintHandler);sleep(1000);return 0; 分别利用本地socket套接字和INTENET套接字实现进程间文件传输 本地socket套接字运行过程 图表 34使用./server1运行服务器,显示服务器等待状态 图表 35当在另外一个终端运行客户端程序时,服务器显示客户连接,并要求输入传输文件名称 图表 36当服务器输入文件名称server1.c后客户端显示接收信息,不过接收到的文件重定向到 test.txt中 图表 37 server1.c的内容 图表 38 客户端接收到显示在test.txt的内容,和server1.c的内容比较,完全一致 本地socket套接字服务器server1.c源代码 #include int filefd,n;//////////////// char file[100],buf[1024];//////////////// int server_sockfd,client_sockfd; int server_len,client_len; struct sockaddr_un server_address; struct sockaddr_un client_address; unlink(“server_socket”); server_sockfd =socket(AF_UNIX,SOCK_STREAM,0); server_address.sun_family =AF_UNIX; strcpy(server_address.sun_path,“server_socket”); server_len =sizeof(server_address); bind(server_sockfd,(struct sockaddr *)&server_address,server_len); listen(server_sockfd,5); while(1) { printf(“server waitingn”); client_len =sizeof(client_address); client_sockfd=accept(server_sockfd,(struct *)&client_address,&client_len); if(client_sockfd!=-1) { printf(“you have a client ,please put the filename to transport!n”); scanf(“%s”,file); if((filefd=open(file,O_RDWR))<0) { perror(“can't find the file”); exit(1); } printf(“filefd= %dn”,filefd); printf(“the file is transported ,please wait...n”); lseek(filefd,0L,0);//每次接受客户机连接,应将用于读的源文件指针移到文件头 write(client_sockfd,file,sizeof(file));//传送文件名 if((n=read(filefd,buf,sizeof(buf)))>0) { } write(client_sockfd,buf,n); sockaddr printf(“you have transport %d bytes and it is end!n”,n); close(client_sockfd); } close(filefd); } } 本地socket套接字客户端client1.c源代码 #include #include int filefd,n,oldfilefd;///////////////// char file[100],buf[1024]; int sockfd; int len; struct sockaddr_un address; int result; sockfd =socket(AF_UNIX, SOCK_STREAM,0); address.sun_family =AF_UNIX; strcpy(address.sun_path,“server_socket”); len=sizeof(address); result=connect(sockfd,(struct sockaddr *)&address,len); if(result ==-1) { perror(“oops:client1”); exit(1); } if(result!=-1) { oldfilefd=open(“test.txt”,O_RDWR); filefd=dup(oldfilefd); read(sockfd,file,sizeof(file)); printf(“the filename you receive is:%sn”,file); if((n=read(sockfd,buf,sizeof(buf)))>0) { write(filefd,buf,n); } printf(“you have received a file which is %d bytes,but the file's context cover the test.txt,so please check into test.txt!n”,n); close(sockfd); } close(filefd); exit(0);} INTENET套接字运行过程 图表 39使用./server2运行服务器,显示服务器等待状态 图表 40当在另外一个终端运行客户端程序时,服务器显示客户连接,并要求输入传输文件名称 图表 41当服务器输入文件名称server2.c后客户端显示接收信息,不过接收到的文件重定向到 test.txt中 图表 42 server2.c的内容 图表 43客户端接收到显示在test.txt的内容,和server2.c的内容比较,完全一致 INTENET套接字服务器server2.c源代码 #include int main(){ int filefd,n;//////////////// char file[100],buf[4096];/////////////////// int server_sockfd,client_sockfd; int server_len,client_len;struct sockaddr_in server_address;struct sockaddr_in client_address;server_sockfd =socket(AF_INET,SOCK_STREAM,0);server_address.sin_family=AF_INET;server_address.sin_addr.s_addr=inet_addr(“127.0.0.1”);server_address.sin_port =9734;server_len=sizeof(server_address);bind(server_sockfd,(struct sockaddr *)&server_address,server_len);listen(server_sockfd,5);while(1) { printf(“server waitingn”); client_len =sizeof(client_address); client_sockfd=accept(server_sockfd,(struct *)&client_address,&client_len); if(client_sockfd!=-1) { printf(“you have a client ,please put the filename to transport!n”);scanf(“%s”,file); if((filefd=open(file,O_RDWR))<0){ sockaddr perror(“can't find the file”); exit(1); } printf(“filefd= %dn”,filefd); printf(“the file is transported ,please wait...n”); lseek(filefd,0L,0);//每次接受客户机连接,应将用于读的源>文件指针移到文件头 write(client_sockfd,file,sizeof(file));//传送文件名 if((n=read(filefd,buf,sizeof(buf)))>0) { write(client_sockfd,buf,n); } printf(“you have transport %d bytes and it is end!n”,n); close(client_sockfd); } close(filefd); } } INTENET套接字客户端client2.c源代码 #include int main(){ int filefd,n,oldfilefd;//////////////////// char file[100],buf[4096];int sockfd;int len;struct sockaddr_in address;int result;sockfd =socket(AF_INET,SOCK_STREAM,0);address.sin_family =AF_INET;address.sin_addr.s_addr =inet_addr(“127.0.0.1”);address.sin_port =9734;len =sizeof(address); result=connect(sockfd,(struct sockaddr *)&address,len); if(result ==-1) { perror(“oops:client2”); exit(1); } if(result!=-1){ oldfilefd=open(“test.txt”,O_RDWR); filefd=dup(oldfilefd); read(sockfd,file,sizeof(file)); printf(“the filename you receive is:%sn”,file); if((n=read(sockfd,buf,sizeof(buf)))>0) { write(filefd,buf,n); } printf(“you have received a file which is %d bytes,but the file's context cover the test.txt,so please check into test.txt!n”,n); close(sockfd);} close(filefd); exit(0);} 感谢与收获 通过这几次上机实习,使我更加扎实的掌握了有关Linux C编程方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过编程,使我们掌握的知识不再是纸上谈兵。 过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 实践课诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。 我认为,在这学期的课程设计中,不仅培养了独立思考、动手操作的能力,在各种 其它能力上也都有了提高。更重要的是,在课程设计上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。