




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主题1外壳编程1.1实验目的Linux操作系统中的Shell是用户与系统内核通信的媒介。它为用户使用操作系统的服务提供了一个命令界面。然而,用户在shell提示符下输入的每个命令($或#)首先由shell解释然后它被传递给内核执行。这个实验要求用C语言编写一个简单的外壳程序,希望达到以下目的:我用C语言编写清晰易读、设计良好的带有详细文档的程序。我熟悉使用Linux软件开发工具,如gcc、gdb和make。在编写系统应用程序时,熟练使用人工帮助手册。我学习使用POSIX/UNIX系统调用、管理进程和完成进程间通信,例如使用信号和管道进行进程间通信。我理解并发程序中的同步问题。锻炼团队成员之间的沟通和合作能力。1.2实验要求1 . 2 . 1 YSH译员的重要特征这个实验是为了实现一个简单的命令解释器,它是Linux中的外壳程序。该实验程序被命名为ysh,它要求其设计类似于当前流行的shell解释器,如bash、csh和tcsh,但它不需要具有如此复杂的功能。Ysh计划应具有以下重要特征:我可以用参数执行外部程序命令。l可以执行内部命令,如fg,bg,cd,history,exit等。l使用管道和输入/输出重定向。l支持前台和后台作业,并提供作业控制功能,包括打印作业列表、更改当前运行作业的前台/后台状态,以及控制作业的暂停、暂停和继续。此外,在这个实验中还必须做到:我用制作工具来制作这个项目。l使用调试器gdb调试程序。提供清晰详细的设计文件和解决方案。1 . 2 . 2 YSH解释程序的具体要求1.外壳程序表单本实验中的Ysh编程不包括对配置文件和命令行参数的支持。如果它被实现来支持像bash这样的配置文件,当然是好的,但是这个实验不需要它。Ysh应提供命令提示符,如ysh,以指示接收用户输入并在每次执行后打印下一个命令提示符ysh。当用户不输入时,ysh需要随时处于等待输入的状态,并在屏幕上显示一些必要的信息。2.外部和内部命令在大多数情况下,用户输入的命令是执行存储在文件系统中的可执行程序,这被称为外部命令或外部程序。Ysh应该支持在执行这些程序时将输入和输出重定向到一个文件,并允许使用管道将几个程序串联起来。从这个实验的角度来看,我们统称由管道连接的复合命令和单独用作操作的命令。外部命令采用一系列分隔字符串的形式。第一个字符串是可执行程序的名称,其他的是传递给这个外部程序的参数。如果第一个字符串声明的可执行文件不存在或不可执行,则该命令被认为是错误的。解释器还必须支持一些内部命令,这些命令在ysh程序中实现特定的动作。以下是一些内部命令。如果用户提交内部命令,ysh应根据以下说明执行相应的操作。退出:结束所有子流程并退出ysh。l作业:打印当前正在后台执行的作业和待定作业的信息。输出信息应采用便于用户理解的格式。作业本身是一个内部命令,因此不需要在输出中显示。Lfg%:将识别的作业放在前台运行。如果作业已经停止,让它继续运行。shell应该等待前台运行的子进程结束,然后再打印新的命令提示符。Lbg%:标识的挂起进程在后台执行。3.命令行当用户在提示符后面输入命令时,整个输入行被称为“命令行字符串”。ysh应该保存每个命令行字符串,直到它所代表的作业的执行结束,包括后台作业和挂起的作业。Ysh应该为每个命令行字符串分配一个非负整数标识符。该整数用于标识存储作业的数据结构。作业的数据结构应该包含整个命令行字符串所代表的内容。一旦由命令行字符串表示的作业完成,ysh将删除表示该作业的数据结构。标识符可以回收。对于包含内部命令的命令行字符串,不需要为它们建立作业的数据结构,因为它们自己的内容都包含在ysh程序中。4.前台和后台工作Ysh应该能够执行前台和后台工作。外壳程序一直等到前台作业执行完毕。但是,当后台作业开始时,应立即打印提示ysh,允许用户输入下一个命令。前台作业的执行总是优先于后台作业的执行。在打印下一个提示之前,ysh不需要等待后台作业完成。无论是否执行后台作业,只要前台作业完成,就会立即输出提示ysh。在后台作业结束时,ysh应在作业完成后立即打印提示消息。以下语法将在命令解析器中引入相应的语法来支持后台作业。5.特殊钥匙也叫组合键。通过终端驱动程序,特殊的组合键可以产生信号给ysh,程序应该对这些信号做出适当的响应。产生信号。此信号不会挂起ysh,但会让shell挂起在前台运行的作业。如果没有前台作业,此特殊键无效。生成SIGINT信号。此信号不会停止ysh,但会发送一个信号来终止前台作业中的进程。如果没有前台作业,此特殊键无效。6.分析用户输入1)分隔符和特殊字符分析用户输入的解析器应该具有以下功能,可以检查用户输入错误。如果用户输入出错,ysh应提供合理的错误信息。就像业务级外壳一样,ysh一次接受用户输入的一行命令,并在用户按下回车键后开始执行分析。空命令不产生任何动作,只打印新的提示。将空格字符定义为分隔符,ysh应该能够处理出现在命令行中间和前后的重复空格字符。有些字符被称为“元字符”,在用户输入的上下文中有特定的含义。这些字符包括“&,|,”。shell假设这些字符不会出现在程序名、参数名和文件名中;它们是为ysh保留的字符。以下部分解释了这些元字符的含义。2)内部命令如果命令行字符串符合前面描述的内部命令的格式,它将被解释为内部命令。如果不是,有必要考虑外部程序的执行可能是错误的。3)输入/输出重定向程序命令后面可以跟有元字符“”或“”,元字符是重定向符号,元字符后面跟有文件名。对于“”,程序的输入被重定向到指定的文件。对于“”,程序的输出被重定向到指定的文件。如果输出文件不存在,您需要创建一个输出文件。如果输入文件不存在,则认为存在错误。4)管道和协作程序当几个命令在命令行中被元字符“|”分隔时,这个元字符代表一个管道符号。在这种情况下,ysh为每个子命令创建一个进程,并输送它们的输入/输出。例如,以下命令行:progA argA1输出文件应该产生两个过程,progA和progB。progA的输入来自文件内嵌,progA的输出是progB的输入,progB的输出是文件输出。该命令行可以通过进程间通信中的管道来实现。包含一个或多个管道的命令会在以下情况下产生错误:当任何子程序不能执行时。除了第一个子程序之外的子程序的输入被重定向。除最后一个子程序之外的子程序的输出被重定向。由管道连接的多个进程组成的作业只有在其所有子进程都执行完之后才能完成。5)背景工作当用户需要在后台执行作业时,可以在作业命令后添加元字符“&”。用户以这种方式输入的作业命令必须在后台执行,而不影响用户与终端的交互。6)语法下面给出的语法规则描述图为控制用户输入提供了更标准化的描述形式。如果命令行分析器是使用现有的工具lex和yacc在Linux中构建的,那么这个语法需要修改,以便它支持LALR(1)(向前看,向左减少)分析方法。这种语法不包括特殊键,因为它们在用户输入时不会显示,而是需要单独处理。命令行代表用户的合法输入,并被用作由ysh执行的“指令”。这里假设有一个词法分析器,它使用空格字符作为分隔符,并将元字符识别为词法标记,等等。命令行:=空fg命令行fg命令行fg命令行:=简单命令第一命令中间命令最后命令简单命令:=程序调用输入直接输出直接first command:=ProgCalocation InputRedirectmid命令:=空| ProgInvocation MidCommandlast command:=| ProgCalocation OutputRedirect程序调用:=ExecFi le参数。输入直接:=空,线ExecFile :=STRING参数:=空字符串参数字符串:=空CHAR STRINGCHAR :=0 |1 | 9| a |b | z | A | B | Z7.关于实验步骤的建议(1)阅读关于fork、exec、wait和exit系统调用的man帮助手册。(2)编写小程序来练习使用这些系统调用。(3)阅读关于功能tcsetpgrp和setpgid的man帮助手册。(4)练习编写小程序来控制过程组,并注意信号SIGTTIN和SIGTTOU。(5)设计命令行分析器(包括设计文件)。(6)实现命令行分析器。(7)使用分析器编写一个简单的外壳程序,以便它可以执行简单的命令。(8)增加对程序在后台运行的支持。无需担心在后台作业结束时打印消息(这是异步通知)。添加作业命令(这有助于调试)。(9)增加输入输出重定向功能。(10)添加代码支持在后台进程结束时打印消息。(11)增加作业控制功能,主要实现对组合键的响应,同时实现fg和bg命令功能。(12)增加对管道的支持。(13)实施并整合所有上述细节。(14)连续测试。写一份报告。(16)结束。1.3相关基础知识1.3.1外壳和内核之间的关系外壳是用户和Linux内核之间的接口程序。如果你把Linux内核想象成一个球体的中心,那么外壳就是内核周围的外壳,如图5-1所示。当命令从外壳或其他程序传递到Linux时,内核将相应地做出响应。Shell是一个命令语言解释器。它有自己的一组内置shell命令,也可以被系统中的其他应用程序调用。用户在提示ysh时输入的命令由外壳解释,然后传递给Linux内核。1.3.2系统调用系统调用是控制状态变化的“函数调用”。系统调用和正常函数过程的区别在于,系统调用的执行将导致特权级别的切换,因为被调用的函数在操作系统的内核中,并且是内核的一部分。操作系统定义了系统调用的集合。为了安全起见,必须小心控制操作系统内部的调用函数。这种控制由硬件通过陷阱向量来执行。只有那些在操作系统启动时填充陷阱向量的地址才是有效的系统调用地址。因此,系统调用是一种“函数调用”,它在受约束的行为下进入保护核心。因为操作系统负责进程控制和调度,ysh需要调用操作系统内部的函数来控制它的子进程。这些函数称为系统调用。在Linux中,我们可以在系统调用和用户应用程序级别区分库函数,因为系统调用函数手册在“帮助”手册的第二部分,库函数在手册的第三部分。“帮助”手册可以通过Linux中的man命令查阅。例如,使用命令man fork将在手册的第二部分给出fork系统调用的描述,而命令man 2 exec将给出exec系统调用系列的描述(2表示手册的第二部分)。还有许多其他系统调用可以通过man命令进行查询。你会发现man是一个非常有用的查阅参考手册的命令。下面是将在实验中使用的重要的UNIX系统调用。Lpid _ tfor (void):创建一个新进程,它是原始进程的副本。在分叉成功返回后,父进程和子进程都将在分叉后继续执行指令。这两个进程通过fork的返回值来区分,fork的返回值是子进程的进程号,子进程的返回值是0。L int execvp (constchar * file,char * constargv ):将可执行程序加载到调用进程的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届辽宁省丹东二十九中学英语九上期末监测模拟试题含解析
- 钢质门施工方案范本
- 2026届黑龙江省牡丹江一中学九上化学期中调研试题含解析
- 婴幼儿照料培训
- 2026届浙江省杭州市萧山区北干初级中学英语九上期末经典模拟试题含解析
- 四川省南充市第五中学2026届英语九上期末综合测试试题含解析
- 小学年度工作总结
- 2026届云南省丽江市名校九年级化学第一学期期中质量检测试题含解析
- 2026届吉林省东北师范大附属中学化学九年级第一学期期中学业水平测试试题含解析
- 2026届福建省福州市第十九中学英语九上期末检测模拟试题含解析
- 合肥市肥东县大学生乡村医生专项计划招聘考试真题2024
- 能源问题面试题库及答案
- TSG-T7001-2023电梯监督检验和定期检验规则宣贯解读
- 火电厂工作原理课件
- 重金属在土壤 植物体系中的迁移及其机制课件
- 抢救车管理制度 课件
- 跌倒坠床不良事件鱼骨图分析
- 供应商分级管理制度管理办法
- 招议标管理办法
- 小儿急性上呼吸道感染的护理查房ppt
- 跨文化交际全套课件
评论
0/150
提交评论