《操作系统实验》指导书
四、实验任务
以下实验任务中,每个学生可在4.1~4.8中任选4项任务。4.9~4.17为“选做内容”,能力较强的学生可在完成上述必做题目基础上,选择几项“选做”任务并努力完成之。4.1~4.17中的各项功能,在“OS实验.exe”程序都已实现,同学们可运行该程序,观察各项功能的执行情况。
4.1 修改md命令
修改md命令,增加“属性”参数,用于创建指定属性的子目录。命令形式如下:
md <目录名>[ <属性>]
属性包括R、H、S以及它们的组合(不区分大小写,顺序也不限)。例如: md user rh
其功能是在当前目录中创建具有“只读”和“隐藏”属性的子目录user。
4.2 修改Help命令或命令行预处理程序
对下面两项任务,每个学生可任选其中一项。 1. 修改help命令的显示方式和显示内容
修改HelpComd()函数,使之提供菜单式的较详细的帮助信息。例如可以先用菜单形式简单列出各命令名称,当用户选择某个命令的序号后,再比较详细地介绍该命令,包括命令的各种形式,每种形式的功能,以及某些举例说明等等。 2. 修改命令行预处理程序
修改命令行预处理函数ParseCommand( ),使以下命令行(命令与参数间无空格符)可以正确执行: cd/ cd.. dir/usr
copy/usr/boy mail ??
即命令名称与后边的“/”或“..”之间不需要空格也能正确执行。
【说明】参考程序已经可以处理类似于“cd/”的形式,但还不能处理“cd..”等形式。另外,若有输出重定向功能,“>”、“>>”也允许不是用空格分隔符(即允许与其它参数连用)。例如:type/usr/boy>>/test
4.3 新增fc命令,实现两个文件的比较
命令形式:fc <文件名1> <文件名2>
命令功能:逐个字节比较指定的两个文件,若相同,显示“文件内容相同”字样;若不同,显示第一个不同字节的位置和各自的内容。若文件不存在则报错。
4.4 新增replace命令,实现文件取代
命令形式:replace <文件名> <目录名>
命令功能:以“文件名”指定的文件,取代“目录名”指定目录中的同名文件。 请按以下要求设计replace命令的函数:
? 若指定文件或被取代文件不存在,则报错; ? 若被取代的是只读属性的文件时,应询问用户; ? 具有隐藏和系统属性的文件不能被取代;
18
《操作系统实验》指导书
? 若目录名参数缺省,则取代当前目录的同名文件;
? 文件名指定的文件和被取代的文件不应该是同一个文件,即不能自己取代自己。
4.5 新增move命令,实现文件“搬家”及子目录改名
命令形式:move <文件名> <目录名> 命令功能:将“文件名”指定的文件或目录,移动到“目标名”指定目录中(名字保持不变)。此命令也可改变子目录名。“文件名”指定被操作的文件或目录,可以是目录名;“目录名”指定“文件名”的新位置或子目录的新名字,即必须是目录名,不能是文件名。文件或子目录转移时不能改名。
? 若转移的是一个文件,且目录名指定的目录原来已经存在,则将该文件转移到指定目
录中;若指定目录中有同名文件,则询问是否覆盖,若同意则覆盖之。
? 若转移的是一个子目录,而“目录名”指定的子目录不存在,则move命令执行子目录
改名操作(必须是同一目录内);若指定目录存在,则将“文件名”指定的目录转移到该目录中,但若指定目录中存在与“文件名”指定的目录同名的子目录,则报错。 move命令的要点归纳如下: (1) 文件或目录,无重名时,可转移到目标目录中(只能同名转移,转移必定是不同目录的); (2) move命令可对子目录改名,但不能用于文件改名(改名操作必定是同目录进行的); (3) 转移时,文件可覆盖文件,目录也可覆盖文件;但文件或目录都不能覆盖目录。 应用举例:
① 将当前目录中的子目录lin,改名为chen,可输入如下命令: move lin chen
【注】前提是lin是当前目录中的一个子目录,而当前目录中无chen子目录和chen文件。 ② 将当前目录中的子目录lin,转移到子目录/bin中,可输入如下命令: move lin /bin
【注】前提是lin是当前目录中的一个子目录,而根目录中已存在子目录bin,且/bin中无名字为lin的子目录。此命令可覆盖子目录/bin中的名字为lin的文件(要询问用户)。 ③ 将目录/usr中的文件boy,转移到当前目录下的bin子目录中,可以输入如下命令: move /usr/boy bin
【注】前提是boy是目录/usr中的一个文件,而当前目录中已存在子目录bin,且bin中无名字为boy子目录。若bin目录中已存在文件boy,则询问用户是否覆盖。 【说明】新增move命令和新增batch命令两项工作可任选其一。
4.6 新增batch命令,实现批处理
(注:设计此命令与设计move命令命令两项工作可任选其一) 命令形式:batch batchfile
命令功能:从磁盘文件batchfile逐行读入命令行执行,直到batchfile中所有命令行都执行完毕为止。
batchfile是一个预先编好的文本文件,其内容是多条可执行命令。例如,预先编好文本文件test.txt,其内容为: cd /usr dir
type boy
copy boy user/box
则执行命令batch test.txt,系统将依次自动执行cd /usr、dir、type boy和copy boy user/box四条命令,跟你用键盘依次输入上述四条命令的执行过程和执行效果完全相同。
【注】(1) 文本文件可以在“记事本”或MSDEV或其他任何文本编辑环境中编写。利用此命
19
《操作系统实验》指导书
令,可以改写(简化)目录初始化程序,建立如图1所示的初始目录结构。
(2) 功能较完整的演示程序“OS实验.exe”,除了从真正的磁盘文件读入并执行批处
理命令外,batch命令还提供了如下形式(带一个参数“s”): batch filename s
该命令从模拟盘Disk[][]中读入批处理文件,并逐条执行命令,例如,模拟盘根目录中有文件test,其内容如下: dir
type map cd usr dir
open /boy cd user/ma type qil_nanj cd / uof
close boy
则在当前目录为根目录时,键入命令:
C:/>batch test s (下划线部分为键入内容) 系统执行过程如下: C:/>dir
The Directory of C:/
bin
auto 0 dev
boy 170 abc_map 203 map 76 test 77 5 file(s) 526 bytes 3 dir(s) 313856 free
C:/>type map A A A A A A A A A A A A A A A A
C:/>cd usr
20
《操作系统实验》指导书
C:/usr>dir
The Directory of C:/usr
..
boy 270 cat 171 dirfile 279 dir0 281
4 file(s) 1001 bytes 4 dir(s) 313856 free
C:/usr>open /boy
文件/boy打开成功。
C:/usr>cd user/ma
C:/usr/user/ma>type qil_nanj
七律 人民解放军占领南京 1949.04
钟山风雨起苍黄,百万雄师过大江。 虎踞龙盘今胜昔,天翻地覆慨而慷。 宜将胜勇追穷寇,不可沽名学霸王。 天若有情天亦老,人间正道是沧桑。
C:/usr/user/ma>cd / C:/>uof
打开文件表UOF的内容如下:
文件名 文件属性 首块号 文件长度 状态/boy 普通 40 170 打开 1 171
C:/>close boy
关闭文件/boy成功。
从上可见,其执行过程与直接键入命令完全相同。
4.7 修改close、type等命令,允许不带文件名参数
修改close、type等命令,使其可以使用如下命令形式: (1) close命令改成可用如下形式: close <文件名>——关闭指定文件
close——关闭当前操作文件(新增形式)
21
读指针 写指针
《操作系统实验》指导书
(2) type命令改成可用如下形式:
type <文件名>——显示指定文件内容
type——显示当前操作文件内容(新增形式)
所谓“当前操作文件”,是指上一次使用create、open、write、read、rewind或fseek等命令操作过的文件。
另外,fseek、rewind、block等非正规操作系统命令也可增加没有文件名的命令形式。如修改fseek命令后,使它可用如下2种命令形式:
fseek <文件名> |p
fseek |p
4.8 完善copy命令
1. 改正某些缺陷
目前参考程序中的copy命令不能处理如下情况:假设当前目录是/usr,执行如下命令之一 copy boy / copy boy ..
上述2条命令应该是将当前目录/usr中的文件boy复制到其父目录(根目录)中,文件名仍为boy。但系统不能正确执行,而显示“目标文件名错误”的信息。正确的功能应该是: ? 若当前目录中不存在文件boy,则报错;
? 第2个命令若当前目录是根目录,因根目录没有父目录,故应报错;
? 若当前目录的父目录中已经存在名为boy的文件,也报错(或询问用户是否覆盖)。 ? 其他情况上述命令都应能正确执行。
请按此要求修改copy命令处理程序,使之在上述命令形式也能正确执行。 2. 允许覆盖同名文件(选做内容)
参考程序中的copy命令,为了程序设计方便,当目标文件存在同名文件或同名子目录时,就停止执行复制操作。可模仿DOS操作系统,修改copy命令,使当目标文件存在同名文件时,询问用户是否覆盖,得到肯定回答时,即使该同名文件是只读文件,也仍然复制(覆盖原先文件,即与目标文件同名的文件被删除)。例如,当执行命令:copy boy /usr/test时,若子目录/usr中已存在文件test,则询问是否覆盖;若test是子目录名,则将文件boy复制到子目录/usr/test下,文件名与源文件相同,即boy。但是如果/usr/test/boy仍为子目录,则显示错误信息,停止执行copy命令。
4.9 增加输出重定向功能(选做内容)
某些命令执行结果在屏幕显示,可以使其输出结果保存到某个文件中(屏幕不再显示),这就是所谓的“输出重定向”功能。例如,可以修改如下命令,使之具有输出重定向功能(输出重定向用符号“>”或“>>”表示): 1. type命令的输出重定向形式
命令形式1:type <文件名1> > <文件名2>
命令功能:将原先应该显示的“文件名1”指定的文件内容,保存到“文件名2”指定的文件中。文件名2指定文件的原先内容被删除。这相当于复制文件。 命令形式2:type <文件名1> >> <文件名2>
命令功能:将原先应该显示的“文件名1”指定的文件内容,保存到“文件名2”指定的文件中。文件名2指定文件的原先内容不删除,新内容接到原先内容尾部。这相当于合并复制文件。
22