Linux实验报告材料_第1页
Linux实验报告材料_第2页
Linux实验报告材料_第3页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux应用实践课程设计报告学 院:专 业:姓 名:学 号:指导教师:王学文摘要Linux诞生于1991年,是一个自由的,免费的,源码开放的操作系统。也是开源软件中最著名的例子。其最主要的目的就是为了建立不受任何商品化软件制约的,全世界都能使用的类Unix兼容产品而我们将服务器部署在Linux将会更加的稳定、安全、高效以及出色的性能。目前国越来越多的服务器应用也开始转向linux平台,学习并掌握如何使用linux对计算机相关专业的学生来说具有重大的意义。关键词:linux , shell , gcc目录1. 前言 12. 需求分析 12.1 课程设计主要任务 12.2 开发环境 12.3 相

2、关工具的的介绍与使用 13. 程序设计 23.1 概要设计 . 23.1.1 shell 9题目分析 23.1.2 system6题目分析 33.1.3 system7题目分析 33.2 详细设计 33.2.1 shell 9过程设计 33.2.2 system 6过程设计 43.2.3 system 7过程设计 74. 代码测试与分析 74.1 shell 9 测试与分析 74.2 system 6测试与分析 84.3 system 7测试与分析 8参考文献 9心得体会 10附录 111. 前言本次 linux 应用实践课程设计通过在 linux 系统下完成 shell 编程和 system

3、 编程,提高对 linux 系统使用的熟练程度,培养以及锻炼自己的动手学习能力。通过完成课程设计容,让自己 能够对 linux 拥有更加深入的了解。由于基础知识欠缺,本次课程设计所涉及的容较为基础,同 时也有利于初学者理解和自己以后的回顾。在这次课程设计中,完成了 linux shell 程序设计与 system 程序设计,通过简单的程序设计掌握基础的 shell 编程以及 gcc 的使用。2. 需求分析2.1 课程设计主要任务根据课程设计任务列表,随机选取一个 shell 编程题目和两个系统编程题目(题目编号之 和=15)。本人选取的题目为为 shell9 , system6 , syste

4、m7 。2.2 开发环境本次课程设计使用 linux 操作系统, shell 采用的为 bash ,同时使用 vim 文本编辑工具编写 代码,使用 gcc 编译。各软件版本号如下:操作系统 : centos 7.2Bash:gcc vim :7.42.3 相关工具的的介绍与使用 linux 操作系统本次使用的 linux 操作系统为 centos 7.2 ,是一个流行的 linux 发行版本,使用的核版本为 3.10.0 。在本次课程设计中,操作系统版本没有具体要求,只要使用 linux 核的操作系统都是可 行的,建议将系统安装到虚拟机。 bashbash (GNU Bourne-Again

5、Shell)是大多数 Linux 系统默认的 shell ,它能运行于大多数类Unix 风格的操作系统之上。 linux 系统上都还有其他的 Shell ,例如 tcsh 、 csh、 ash、 bsh、 ksh 等等。 shell 脚本文件大致都类同,使用的方法为在终端使用命令”bash filename ” 执行 shell脚本文件, 或者在脚本文件首行添加 “#!/bin/bash ”, 再给脚本文件添加执行权限后执行 shell 脚本文件。 gcc通常所说的GCC是 GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级

6、语言编写的源代码构建成计算机能够直接执行的二进制代 码。gcc的编译过程通常包含了四个步骤,分别为预处理- 编译- 汇编- 四步。可以通过如下指令来编译出一个可执行文件 :gcc filename.c此命令执行完后会生成一个 a.out 的可执行文件。同时也可以指定生成的可执行文件名,命令如 下:gcc filename.c -o filename.out此命令执行完后会生产一个名为 filename.out 的可执行文件。 gcc 还有许多命令, 详细部分不是 本文所讨论的容。 vimvi 命令是UNIX操作系统和类 UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫v

7、im,它是vi的增强版(vi Improved ),与vi编辑器完全兼容,而且实现了很多增强 功能。 vi 编辑器支持编辑模式和命令模式, 编辑模式下可以完成文本的编辑功能, 命令模式下可 以完成对文件的操作命令,要正确使用 vi 编辑器就必须熟练掌握着两种模式的切换。3. 程序设计3.1 概要设计3.1.1 shell9 题目分析问题描述:编写一个shell脚本ex9.sh,根据键盘输入的值,给出对应的提示输出;输入 A - Z,输 出 Uppercase Letter ;输入 a-z ,输出 Lowercase Letter ;输入 0-9 ,输出 Digit ;输入 其他,输出 Punc

8、tuation, whitespace, or other。算法分析:可以使用 bash shell 中的 read 命令接收键盘的输入,得到输入后, read 命令将数据放入一 个标准变量中。通过 grep 命令使用正则表达式对变量的值进行容匹配,若匹配出大写字母则使 用 echo 命令输出 Uppercase Letter ,同理若匹配出小写或数字则输出相应的容。3.1.2 system6 题目分析问题描述:首先建立一个守护进程,然后让该守护进程每隔 10s 在 /tmp/dameon.log 中写入一句话。 算法分析:首先用 fork( ) 函数建立一个子进程 , 建立成功后退出父进程,

9、使用 setsid( ) 函数在子进程 中创建新会话,使子进程摆脱其他进程的影响。再改变当前目录为根目录,避免在运行过程中对 文件系统操作时产生的诸多麻烦。重设文件权限掩码,增强守护进程的灵活性。然后关闭从父进 程中继承的文件描述符。做完以上步骤后,在子进程中使用 open() 函数打开 /tmp/dameon.log 文 件,使用 sleep() 函数每隔 10 秒用 write() 函数向文件中写入一句话。3.1.3 system7 题目分析问题描述:在 tmp 目录下调用 open() 函数,以可读可写的方式创建 hello.c 文件。 open 函数带有 3 个 flag 参数:O_C

10、REATE O_TRUN、O_WRONLY文件权限设置为 0600。算法分析:使用 chdir 将当前目录改为 tmp 目录,使用 open() 函数打开 hello.c 文件,同时带上 3 个 flag 参数:O_CREATE O_TRUN、O_WRONLY文件权限设置为 0600。3.2 详细设计3.2.1 shell 9 过程设计关键代码:read awhile truedoif echo $a | grep -q F0-9a-zA-Z;the necho Punctuation, whitespace, or other;fiif echo $a | grep -q A-Z; then

11、echo Uppercase Letterfiread adone过程分析:使用read命令从命令行中接收键盘的输入,将接收到的数据赋值给变量a,使用echo将变量 a 的值通过管道传递到 grep 命令,使用 grep 命令对接收到的值进行匹配,使用 if 根据值的 类型输出相应的提示,若是大写字母则输出 Uppercase Letter ,小写字母则输出 Lowercase Letter , 数字则输出 Digit ,若都不是则输出 Punctuation, whitespace, or other。最后通过 while 循环不断地重复输入检测的过程。此处使用的 read 命令为 bash

12、 自带的命令,功能为接收键盘输入并赋值给变量。同样 echo 是 bash 中的输出命令,用以在命令行中进行输出显示。“ | ”符号为 Linux 中的管道符号,它能 处理经由前面一个指令传出的正确输出信息,然后将其传递给下一个命令,作为标准的输入。这 里就是将变量 a 的值传递给 grep 命令, 作为 grep 的输入。 其中, grep 命令是 linux 系统中一种 强大的搜索工具,它能使用正则表达式搜索文本,并把匹配的行输出出来。由于grep 命令默认将匹配出来的行输出,所以在上述代码中使用了 -q 参数,用于防止向命令行输出。在 grep 命令 后的是正则表达式, A-Z 用于匹配

13、大写字母, a-z 用于匹配小写字母, 0-9 用于匹配数字, F0-9a-zA-Z用于进行非字母和数字的匹配。3.2.2 system 6 过程设计关键代码: pc=fork(); if(pc0)exit(0);setsid();chdir(/);umask(0);for(i=0;iMAXFILE;i+)close(i);while(1)if(fd=open(/tmp/dameon.log,O_CREAT|O_WRONLY|O_APPEND,0600)0) write(fd,str,len+1);close(fd);sleep(10);过程分析:首先使用 fork() 函数新建一个子进程,若

14、失败则输出错误提示并退出程序,成功则将使 用 exit() 函数将父进程退出,此时子进程变成一个孤儿进程被 init 进程接管。此时, 使用 setsid() 函数创建新的会话, 这个步骤是创建守护进程中最重要的一步。 由于 在调用了 fork 函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程 退出了,但会话期、进程组、控制终端等并没有改变,因此,这还不是真正意义上的独立开来, 而 setsid 函数能够使进程完全独立出来,从而摆脱其他进程的控制。使用 chdir() 改变当前目录为根目录。在使用 fork() 创建子进程时,子进程继承了父进 程当前的工作目录,由于在进程

15、运行中,当前目录所在的文件系统是不能被卸载的,会对以后的 文件系统操作造成不必要的麻烦,通常的做法是将根目录作为守护进程的工作目录,以防止错误 发生。同时由于子进程在创建过程中也继承了父进程的文件权限掩码, 会对子进程使用文件带来 麻烦,这里使用 umask() 函数将文件权限掩码设置为 0 以增加文件使用的灵活性。同样地,在创建子进程时,子进程会从父进程那里继承一些已经打开的文件。这些文件不 会被守护进程读写, 但是同样会占用系统资源。 在使用 setsid() 函数创建会话后, 守护进程已经 与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规 方法(如 p

16、rintf )输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。这里将可能存在的文 件描述符都使用 close() 函数关闭(设置一个较大值来却确保从父进程继承的文件描述符都会被 关闭)。完成上述步骤后便可开始子进程对 /tmp/daemon.log 文件的写入操作。这里使用 while 循环不断地进行文件的打开、写入、关闭的操作,若文件打开失败则使用 perror() 函数输出异常,再 使用 exit(1) 函数异常退出。其中 close() 函数用于关闭打开的文件, sleep() 函数用于使守护进 程休

17、眠 10s 。函数功能解析:open() 函数用于文件的打开或新建,用法为open(constchar* pathname,int flags,mode_t mode)。函数的第一个参数 pathname 为文件的路径,第二个参数 flags 为打开文件所采取的动作具体描述 如下:O_RDONLY以只读的方式打开文件O_WRONLY以只写的方式打开文件O_RDWR以可读可写的方式打开文件O_APPEND每次写操作都写入文件的末尾O_CREAT如果指定文件不存在,则创建这个文件O_EXCL如果要创建的文件已存在,则返回 -1 ,并且修改 errno 的值O_TRUNC如果文件存在,并且以只写 /

18、 读写方式打开,则清空文件全部容第三个参数 mode 为设置文件访问权限的初始值, 由一个八进制数字表示, 与用户掩码 umask 变量有关,实际的访问权限由 mode 与 umask 确定。其中数字的第一位代表特殊权限,第二位代表文件所有者,第三位代表文件用户组,第四位代表其他用户。在 linux 文件权限中,数字 7 代表拥有可读可写可执行的权限,数字6 代表拥有读写权限,数字4 代表拥有可读取得权限,数字0 代表没有任何权限。例如具体2 代表拥有可写入的权限,数字 1 代表拥有可执行的权限,数字 用法如下:0600 权限,代表该文件所有者具有可读、可写的权限。0400 权限,代表该文件所

19、有者具有可读取的权限。0070 权限,代表该文件用户组具有可读、可写及可执行的权限。0010 权限,代表该文件用户组具有可执行的权限。0002 权限,代表其他用户具有可写入的权限。write() 函数用于文件的写入使用,用法为 write(int fd,const void *buf,size_t nbytes)write函数将buf中的nbytes字节容写入文件描述符fd.成功时返回写的字节数.失败时返回-1.并设置errno变量.在网络程序中,当我们向套接字文件描述符写时有俩种可能1) write的返回值大于0,表示写了部分或者是全部的数据2) 返回的值小于0,此时出现了错误.我们要根据错

20、误类型来处理.如果错误为EINTR表示在写的时候出现了中断错误.perror() 函数用法为:perror ( con st char * str ),用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数str所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno(这里的说法不准确,errno 是一个宏,该宏返回左值)的值来决定要输出的字符 串。3.2.3 system 7过程设计关键代码:int fd;chdir( “/tmp ” );if(fd = ope n(hello.c,0_CREAT|0_RDWR,0600)0)close(fd);过程分析

21、:先定义一个整形变量 fd,使用chdir将当前工作目录改为/tmp目录,再使用open函数新建hello.c 文件(open函数参数说明请参照 system6),其中flag 参数设置为 O_CREATEO_TRUN、 O_WRONLY文件权限设置为 0600。4. 代码测试与分析4.1 shell 9 测试与分析Purtctcatiart, whitespace, or otherDigit由运行截图可知,此 shell脚本成功完成了任务要求,能根据不同的输入类型来输出相应的 提示。除了能单个输入以外,还能同时输入多个不同的字符,根据输入的字符类型输出相应的提 示。4.2 system6测

22、试与分析flastnaiocalhosr Tirip$ 11总用屋4”e. j flash flash 1292 1?月 12;56 dnvon.logThis i$ b Dflmeon由运行截图可知,此 system程序成功建立守护进程,并在 /tmp目录下新建一个用户权限为读写权限的dameon.log文件,并每次写入一句话4.3 system 7测试与分析rw1 flash flash 0 12月 23 15:50 helloshello.c由运行截图可知,此system程序在tmp目录下成功新建一个用户权限为读写权限的 文件。参考文献1 泽丄inx Shell编程的艺术M.:电子工业,

23、2013 : 37-235.2 孟庆昌.Li nux 教程第三版M.:电子工业,2011 : 100-209.3 梁贤海.守护进程的详细总结EB/OL., 2016-11-26/2016-12-16心得体会这几周的 linux 课程设计过程,让我对 linux 有了更加深入的了解。尽管在学习中经常会遇 到各种各样的问题,给课程设计的完成带来一定的麻烦,但在解决问题的过程中,却让我学到了 更多的知识,也锻炼了自己的学习能力。在这次的课程设计的驱使下,我懂得了 shell 脚本编程 的一些基础知识和常用命令的使用,以及能够独立的写出一些简单的 shell 脚本文件。同时,在 解决对 shell 9 中的输入检测问题中,我对正则表达式有了初步的认识,并认识到正则表达式的 强大之处, 相信这会对我以后学习具有积极的作用。 在完成 system 题目设计过程中, 让我对 linux 下的 c 语言编程有了一定的认识,掌握了如何使用gcc 编译程序已经使用 gdb 调试程序。更难道的是,这次的课程设计让我明白了什么是守护进程,子进程在创建过程中与父进程产生的复杂的 继承关系,同时也让我对 linux 的文件权限管理有了一定的认识。附录shell 9 代码#!/bin/bash read a while true doif echo $a | grep -q F0-9a-zA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论