Linux实验报告.doc_第1页
Linux实验报告.doc_第2页
Linux实验报告.doc_第3页
Linux实验报告.doc_第4页
Linux实验报告.doc_第5页
免费预览已结束,剩余16页可下载查看

下载本文档

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

文档简介

Linux应用实践课程设计报告学 院: 专 业: 姓 名: 学 号: 指导教师: 王学文 年 月 日摘要Linux诞生于1991年,是一个自由的,免费的,源码开放的操作系统。也是开源软件中最著名的例子。其最主要的目的就是为了建立不受任何商品化软件版权制约的,全世界都能使用的类Unix兼容产品.而我们将服务器部署在Linux将会更加的稳定、安全、高效以及出色的性能。目前国内越来越多的服务器应用也开始转向linux平台,学习并掌握如何使用linux对计算机相关专业的学生来说具有重大的意义。关键词:linux,shell,gcc目录1. 前言12. 需求分析12.1课程设计主要任务12.2 开发环境12.3 相关工具的的介绍与使用13.程序设计23.1概要设计23.1.1 shell 9 题目分析23.1.2 system6 题目分析33.1.3 system7 题目分析33.2 详细设计3 3.2.1 shell 9 过程设计33.2.2 system 6 过程设计43.2.3 system 7 过程设计74.代码测试与分析7 4.1 shell 9 测试与分析7 4.2 system 6 测试与分析8 4.3 system 7 测试与分析8参考文献9心得体会10附录111. 前言 本次linux应用实践课程设计通过在linux系统下完成shell编程和system编程,提高对linux系统使用的熟练程度,培养以及锻炼自己的动手学习能力。通过完成课程设计内容,让自己能够对linux拥有更加深入的了解。由于基础知识欠缺,本次课程设计所涉及的内容较为基础,同时也有利于初学者理解和自己以后的回顾。在这次课程设计中,完成了linux shell程序设计与system程序设计,通过简单的程序设计掌握基础的shell编程以及gcc的使用。2. 需求分析 2.1课程设计主要任务 根据课程设计任务列表,随机选取一个shell编程题目和两个系统编程题目(题目编号之和=15)。本人选取的题目为为shell9,system6,system7。 2.2 开发环境 本次课程设计使用linux操作系统,shell采用的为bash,同时使用vim文本编辑工具编写代码,使用gcc编译。各软件版本号如下: 操作系统:centos 7.2 Bash:4.2.46 gcc :4.8.5 vim:7.4 2.3 相关工具的的介绍与使用 linux操作系统 本次使用的linux操作系统为centos 7.2,是一个流行的linux发行版本,使用的内核版本为3.10.0。在本次课程设计中,操作系统版本没有具体要求,只要使用linux内核的操作系统都是可行的,建议将系统安装到虚拟机。 bashbash (GNU Bourne-Again Shell) 是大多数Linux系统默认的shell,它能运行于大多数类Unix风格的操作系统之上。linux系统上都还有其他的Shell,例如tcsh、csh、ash、bsh、ksh等等。shell脚本文件大致都类同,使用的方法为在终端使用命令”bash filename” 执行shell脚本文件,或者在脚本文件首行添加 “#!/bin/bash” ,再给脚本文件添加执行权限后执行shell脚本文件。 gcc 通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。gcc的编译过程通常包含了四个步骤,分别为预处理-编译-汇编-链接四步。可以通过如下指令来编译出一个可执行文件: gcc filename.c 此命令执行完后会生成一个a.out的可执行文件。同时也可以指定生成的可执行文件名,命令如下: gcc filename.c -o filename.out此命令执行完后会生产一个名为filename.out的可执行文件。gcc还有许多命令,详细部分不是本文所讨论的内容。 vim vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能。vi编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用vi编辑器就必须熟练掌握着两种模式的切换。3. 程序设计 3.1概要设计 3.1.1 shell9题目分析 问题描述:编写一个shell脚本ex9.sh,根据键盘输入的值,给出对应的提示输出;输入 AZ,输出 Uppercase Letter;输入a-z,输出 Lowercase Letter;输入0-9,输出 Digit;输入其他,输出Punctuation, whitespace, or other。 算法分析:可以使用bash shell中的read命令接收键盘的输入,得到输入后,read命令将数据放入一个标准变量中。通过grep命令使用正则表达式对变量的值进行内容匹配,若匹配出大写字母则使用echo命令输出Uppercase Letter,同理若匹配出小写或数字则输出相应的内容。 3.1.2 system6 题目分析 问题描述: 首先建立一个守护进程,然后让该守护进程每隔 10s 在/tmp/dameon.log 中写入一句话。 算法分析:首先用fork( )函数建立一个子进程,建立成功后退出父进程,使用setsid( )函数在子进程中创建新会话,使子进程摆脱其他进程的影响。再改变当前目录为根目录,避免在运行过程中对文件系统操作时产生的诸多麻烦。重设文件权限掩码,增强守护进程的灵活性。然后关闭从父进程中继承的文件描述符。做完以上步骤后,在子进程中使用open()函数打开/tmp/dameon.log文件,使用sleep()函数每隔10 秒用write()函数向文件中写入一句话。 3.1.3 system7 题目分析 问题描述: 在tmp目录下调用open()函数,以可读可写的方式创建hello.c文件。open 函数带有3个flag参数:O_CREATE、O_TRUNC、O_WRONLY,文件权限设置为0600。 算法分析: 使用chdir将当前目录改为tmp目录,使用open()函数打开hello.c文件,同时带上3个flag参数:O_CREATE、O_TRUNC、O_WRONLY,文件权限设置为0600。3.2 详细设计 3.2.1 shell 9 过程设计关键代码: read a while true do if echo $a | grep -q 0-9a-zA-Z;then echo Punctuation, whitespace, or other; fi if echo $a | grep -q A-Z; then echo Uppercase Letter fi . read a done 过程分析: 使用read命令从命令行中接收键盘的输入,将接收到的数据赋值给变量a,使用echo 将变量a的值通过管道传递到grep命令,使用grep命令对接收到的值进行匹配,使用if根据值的类型输出相应的提示,若是大写字母则输出 Uppercase Letter,小写字母则输出Lowercase Letter ,数字则输出Digit,若都不是则输出 Punctuation, whitespace, or other。最后通过while循环不断地重复输入检测的过程。 此处使用的read命令为bash自带的命令,功能为接收键盘输入并赋值给变量。同样echo是bash中的输出命令,用以在命令行中进行输出显示。“|”符号为Linux中的管道符号,它能处理经由前面一个指令传出的正确输出信息,然后将其传递给下一个命令,作为标准的输入。这里就是将变量a的值传递给grep命令,作为grep的输入。其中,grep命令是linux系统中一种强大的搜索工具,它能使用正则表达式搜索文本,并把匹配的行输出出来。由于grep命令默认将匹配出来的行输出,所以在上述代码中使用了-q参数,用于防止向命令行输出。在grep命令后的是正则表达式,A-Z用于匹配大写字母,a-z用于匹配小写字母,0-9用于匹配数字,0-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()函数新建一个子进程,若失败则输出错误提示并退出程序,成功则将使用exit()函数将父进程退出,此时子进程变成一个孤儿进程被init进程接管。 此时,使用setsid()函数创建新的会话,这个步骤是创建守护进程中最重要的一步。由于在调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,这还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱其他进程的控制。 使用chdir()改变当前目录为根目录。在使用fork() 创建子进程时,子进程继承了父进程当前的工作目录,由于在进程运行中,当前目录所在的文件系统是不能被卸载的,会对以后的文件系统操作造成不必要的麻烦,通常的做法是将根目录作为守护进程的工作目录,以防止错误发生。 同时由于子进程在创建过程中也继承了父进程的文件权限掩码,会对子进程使用文件带来麻烦,这里使用umask()函数将文件权限掩码设置为0以增加文件使用的灵活性。同样地,在创建子进程时,子进程会从父进程那里继承一些已经打开的文件。这些文件不会被守护进程读写,但是同样会占用系统资源。在使用setsid()函数创建会话后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。这里将可能存在的文件描述符都使用close()函数关闭(设置一个较大值来却确保从父进程继承的文件描述符都会被关闭)。完成上述步骤后便可开始子进程对/tmp/daemon.log文件的写入操作。这里使用while循环不断地进行文件的打开、写入、关闭的操作,若文件打开失败则使用perror()函数输出异常,再使用exit(1)函数异常退出。其中close()函数用于关闭打开的文件,sleep()函数用于使守护进程休眠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 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容第三个参数mode为设置文件访问权限的初始值,由一个八进制数字表示,与用户掩码umask变量有关,实际的访问权限由mode与umask确定。其中数字的第一位代表特殊权限,第二位代表文件所有者,第三位代表文件用户组,第四位代表其他用户。在linux文件权限中,数字7代表拥有可读可写可执行的权限,数字6代表拥有读写权限,数字4代表拥有可读取得权限,数字2代表拥有可写入的权限,数字1代表拥有可执行的权限,数字0代表没有任何权限。例如具体用法如下:0600 权限,代表该文件所有者具有可读、可写的权限。0400 权限,代表该文件所有者具有可读取的权限。0070 权限,代表该文件用户组具有可读、可写及可执行的权限。0010 权限,代表该文件用户组具有可执行的权限。0002 权限,代表其他用户具有可写入的权限。 write()函数用于文件的写入使用,用法为write(int fd,const void *buf,size_t nbytes) write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量. 在网络程序中,当我们向套接字文件描述符写时有俩种可能. 1)write的返回值大于0,表示写了部分或者是全部的数据. 2)返回的值小于0,此时出现了错误.我们要根据错误类型来处理. 如果错误为EINTR表示在写的时候出现了中断错误. perror()函数用法为:perror ( const char * str ),用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 str所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno(这里的说法不准确,errno是一个宏,该宏返回左值) 的值来决定要输出的字符串。 3.2.3 system 7 过程设计 关键代码: int fd; chdir(“/tmp”);if(fd = open(hello.c,O_CREAT|O_RDWR,0600)0) . close(fd); 过程分析:先定义一个整形变量fd,使用chdir将当前工作目录改为/tmp目录,再使用open函数新建hello.c文件(open函数参数说明请参照system6),其中flag参数设置为O_CREATE、O_TRUNC、O_WRONLY,文件权限设置为0600。4. 代码测试与分析 4.1 shell 9 测试与分析由运行截图可知,此shell脚本成功完成了任务要求,能根据不同的输入类型来输出相应的提示。除了能单个输入以外,还能同时输入多个不同的字符,根据输入的字符类型输出相应的提示。 4.2 system6 测试与分析由运行截图可知,此system程序成功建立守护进程,并在/tmp目录下新建一个用户权限为读写权限的dameon.log文件,并每次写入一句话 4.3 system 7 测试与分析由运行截图可知,此system程序在tmp目录下成功新建一个用户权限为读写权限的hello.c文件。参考文献1 张泽.Linx Shell编程的艺术M.北京:电子工业出版社, 2013:37-235.2 孟庆昌.Linux 教程 第三版M.北京:电子工业出版社, 2011:100-209.3 梁贤海.守护进程的详细总结EB/OL. /liangxanhai/article/details/7752898,2016-11-26/2016-12-16心得体会 这几周的linux课程设计过程,让我对linux有了更加深入的了解。尽管在学习中经常会遇到各种各样的问题,给课程设计的完成带来一定的麻烦,但在解决问题的过程中,却让我学到了更多的知识,也锻炼了自己的学习能力。在这次的课程设计的驱使下,我懂得了shell脚本编程的一些基础知识和常用命令的使用,以及能够独立的写出一些简单的shell脚本文件。同时,在解决对shell 9中的输入检测问题中,我对正则表达式有了初步的认识,并认识到正则表达式的强大之处,相信这会对我以后学习具有积极的作用。在完成system题目设计过程中,让我对linux下的c语言编程有了一定的认识,掌握了如何使用gcc编译程序已经使用gdb调试程序。更难道的是,这次的课程设计让我明白了什么是守护进程,子进程在创建过程中与父进程产生的复杂的继承关系,同时也让我对linux的文件权限管理有了一定的认识。附录shell 9 代码#!/bin/bashread awhile truedo if echo $a | grep -q 0-9a-zA-Z;then echo Punctuation, whitespace,

温馨提示

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

评论

0/150

提交评论