1设计内容与要求.doc

上传人:bao****ty 文档编号:143637278 上传时间:2020-09-01 格式:DOC 页数:10 大小:67.50KB
返回 下载 相关 举报
1设计内容与要求.doc_第1页
第1页 / 共10页
1设计内容与要求.doc_第2页
第2页 / 共10页
1设计内容与要求.doc_第3页
第3页 / 共10页
1设计内容与要求.doc_第4页
第4页 / 共10页
1设计内容与要求.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《1设计内容与要求.doc》由会员分享,可在线阅读,更多相关《1设计内容与要求.doc(10页珍藏版)》请在金锄头文库上搜索。

1、1设计内容与要求1.1课程设计内容用户在shell提示符($或#)下输入的每一个命令都由shell先解释,然后传给内核执行。本课程设计要求用C语言编写一个简单的shell程序,希望达到以下目的: 用C语言编写清晰易读、设计优良的程序,并附有详细的文档。 熟悉使用Linux下的软件开发工具,例如gcc、gdb和make。 在编写系统应用程序时熟练使用man帮助手册。 学习使用POSIXUNIX系统调用、对进程进行管理和完成进程之间的通信,例如 使用信号和管道进行进程间通信。 理解并发程序中的同步问题。1.2课程设计要求minish解释程序的重要特征 本课程设计要实现一个简单的命令解释器,也就是L

2、inux中的shell程序。课程设计程序起名为minish,要求其设计类似于目前流行的shell解释程序,如bash、csh、tcsh,但不需要具备那么复杂的功能。minish程序应当具有如下一些重要的特征: 能够执行外部程序命令,命令可以带参数。 能够执行fg、bg、cd、history、exit等内部命令。 使用管道和输入输出重定向。 支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前运行作业的前台/后台状态,以及控制作业的挂起、中止和继续运行。 除此之外,在这个课程设计中还须做到: 使用make工具建立工程。 使用调试器gdb来调试程序。 提供清晰、详细的设计文档和解决方案。

3、2.设计说明2.1 问题描述为Linux内核设计一个shell程序,解释执行用户提交的命令行。该shell程序应实现下列功能:(1)解析用户提交的命令行;按照环境变量搜索目录系统;执行命令。(2)执行外部程序命令,命令可以带参数。 (3)提供fg、bg、cd、history、exit等内部命令。(3)提供管道和输入输出重定向。(4)提供作业控制功能,包括打印作业的清单,改变当前运行作业的前台/后台状态,以及控制作业的挂起、中止和继续运行。2.2 解决方案1. shell程序形式首先应复习操作系统有关shell的基本概念,理解shell程序的作用,了解其功能。掌握shell与内核的关系。学习ba

4、sh的使用方法,从感性上把握shell程序。shell程序形式可以参考bash。shell应提供一个命令提示符,表示接收用户的输入。这个提示符由设计者自己定义,如QQ或myshell之类,每次执行完成后再打印下一个命令提示符QQ。当用户没有输入时,myshell需要一直处于随时等待输入状态,同时在屏幕上显示一些必要的信息。2. 命令行 当用户在提示符后面输入命令时,输入的整行内容叫做“命令行字符串”,shell应当保存每一条命令行字符串,直到它表示的作业执行结束,其中包括后台作业和被挂起的作业。 shell应当给每一个命令行字符串赋一个非负整数标识符。这个整数用来标识存储作业的数据结构,作业的

5、数据结构应包含整个命令行字符串所表示的内容。一旦命令行字符串代表的作业执行结束,shell就要删掉表示这个作业的数据结构。标识符可以循环使用。 对于包含内部命令的命令行字符串,不需要为它们建立作业的数据结构,因为它们本身的内容全部包含在shell程序中。3. 外部命令和内部命令 在大多数情况下,用户输入的命令是执行存储在文件系统中的可执行程序,我们叫做外部命令或外部程序。shell应当支持在执行这些程序时可以将输入/输出重新定向到一个文件,并允许若干个程序使用管道串联起来。从本课程设计的角度来讲,我们把由管道连接起来的复合命令以及单独使用的命令统称为作业。 外部命令的形式是一系列分隔的字符串。

6、第一个字符串是可执行程序的名字,其他的是传给这个外部程序的参数。如果第一个字符串所声明的可执行文件并不存在或者不可执行,则认为这个命令是错误的。 解释器还须支持一些内部命令,这些命令在shell程序内部实现了特定的动作,下面是一些内部命令,如果用户提交一个内部命令,shell应当按照下面的描述执行相应动作。 exit:结束所有的子进程并退出shell。4.分析用户输入(1) 分隔符和特殊字符 分析用户输入的语法分析器应具有下面介绍的功能,它能够检查用户的输入错误。如果用户输入的某些地方出错了,shell应提供合理的出错信息。 就像商业级别的shell一样,shell每次接受用户输入的一行命令,

7、在用户按下回车键(Enter)后开始执行分析动作。空命令不产生任何操作,而只是打印一个新提示符。 定义空格符为分隔符,shell应能处理命令行中间和前后出现的重复空格符。 某些字符被称做“元字符”,它们在用户输入的上下文中具有特定的含义。这些字符包括“&、|、”。shell假设这些字符不会出现在程序名、参数名和文件名中,它们是shell的保留字符。下面几小节会解释这些元字符的含义。(2) 内部命令 如果命令行字符串符合前面介绍的内部命令的格式,它就作为一个内部命令被解释。如果不是,就要考虑可能是外部程序的执行,或者是错误的。2.5 函数分析1用到的UNIX系统调用chdir 系统调用系统调用c

8、hdir是用来将进程的当前工作目录改为由参数指定的目录。该调用的声明格式如下: int chdir(const char *path);在使用该调用的程序中加入下面的头文件:#include 使用该调用时要注意,发出该调用的进程必须对参数path指定的目录有搜索(execute)的权力。调用成功时,返回值为0;错误时,返回-1,并设置相应的错误代码。 fork 系统调用系统调用fork是用来创建一个子进程。系统调用fork和vfork的声明格式如下: pid_t fork(void);在使用该系统调用的程序中要加入以下头文件:#include 当调用执行成功时,该调用对父进程返回子进程的PID

9、,对子进程返回0。调用失败时,给父进程返回-1,没有子进程创建。 exit 系统调用系统调用exit的功能是终止发出调用的进程。它的声明格式如下: void exit(int status);在使用这个系统调用的程序中要加入以下头文件:#include 系统调用exit立即终止发出调用的进程。所有属于该进程的文件描述符都关闭。该进程的所有子进程由进程1(进程init)接收,并对该进程的父进程发出一个SIGCHLD(子进程僵死)的信号。参数status作为退出的状态值返回父进程,该值可以通过系统调用wait来收集。返回状态码status只有最低一个字节有效。如果进程是一个控制终端进程,则SIGH

10、UP信号将被送往该控制终端的前台进程。系统调用exit从不返回任何值给发出调用的进程;也不刷新I/O缓冲,如果要自动完成刷新,可以用函数调用exit。waitpid系统调用它的声明格式:pid_t waitpid(pid_t pid, int *status, int options);在使用这些系统调用的程序中要加头文件:#include #include waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回

11、。如果不在意结束状态值,则参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码,其他数值意义如下: pid0 等待任何子进程识别码为 pid 的子进程 2应用到的函数 access()函数用来判断是否具有存取文件的权限 int access(const char * pathname,int mode); 函数说明 :access()会检查是否可以读/写某一已存在的文件。 参数mode有几种情况组合,R_OK,W_OK,X_OK和F_OK。 R_OK,W_OK与X_OK用来检查文件是否具有读取、写入和执行的权限。 F_OK则是用来判断该文件是否存在。 getenv(取得

12、环境变量内容)应加入的头文件:#include;它的声明格式如下:char * getenv(const char *name);函数说明:getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为namevalue。返回值:执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。2.6 测试rootlocalhost root#cd shell rootlocalhostshell#gcc o shell shell.crootlocalhostshell#./shell myshell*/roo

13、t/shell lsa.txt shell shell.c shellpp shellpp.c myshell*/root/shell psPID TTY TIME CMD2461 pts/0 00:00:00 bash2503 pts/0 00:00:00 shell2503 pts/0 00:00:00 psmyshell*/root/shell cd /binEnter into cd commandmyshell*/bin cd .myshell*/cd root/shellmyshell*/root/shellmkdir abcmyshell*/root/shelllsa.txt s

14、hell shell.c shellpp shellpp.c abcmyshell*/root/shell exitgoodbye! myshell!3 总结这次课程设计对我们来说是一个挑战,因为涉及到的知识点比较多,而且有很多知识我们以前都没怎么接触过。比如Linux的一些系统调用以及用C编写的一些语法和规则。虽然一开始我们都不知道如何下手,但是通过查找资料以及参考老师给的代码,以及老师的耐心解答,我们学到了很多知识。,熟悉了Linux下的开发工具,学习了Linux下的编程环境,对Linux系统有了总体的认识。了解了一些C语言的库函数,接触了Linux的进程编程知识,比如说利用管道实现进程间的通信,当然这当中我们会要用到大量的系统调用,之前

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号