资源预览内容
第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
第9页 / 共20页
第10页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
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以增加文件使用的灵活性。同样地,在创建子进程时,子进程会从父进程那里继承一些已经打开的文件。这
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号