操作系统上机实验报告.docx
《操作系统上机实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统上机实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统上机实验报告
操作系统上机实验报告
课程设计(上机实习)报告
课程设计(上机实验)题目:
文件系统的模拟设计
目的与任务:
理解操作系统文件系统的某些工作原理,学习文件操作命令和目录操作命令的设计方法。
通过实验,使学生加深对操作系统文件系统某些问题的理解,归纳学习方法和思考方法,做到理论联系实际。
培养学生分析问题、解决问题的能力,提高学生软件设计能力和逻辑思维能力。
设计实现一个简单的文件系统,包括目录文件、普通文件,以及一些文件操作命令和目录操作命令(例如可以模仿DOS的有关命令)。
1.修改md命令;
2.修改Help命令;
3.修改命令行预处理程序;
4.新增fc命令,实现两个文件的比较;
5.新增batch命令,实现批处理;
6.完善copy命令,改善某些缺陷。
内容和要求:
1.修改md命令:
增加“属性”参数,用于创建指定属性的子目录。
命令形式如下:
md<目录名>[<属性>]。
属性包括R、H、S以及它们的组合(不区分大小写,顺序也不限)。
例如:
mdusrrh
其功能是在当前目录中创建具有“只读”和“隐藏”属性的子目录user.
2.修改Help命令:
修改help命令的显示方式和显示内容:
修改HelpComd()函数,使之提供菜单式的较详细的帮助信息。
例如可以先用菜单形式简单列出各命令名称,当用户选择某个命令的序号后,再比较详细地介绍该命令,包括命令的各种形式,每种形式的功能,以及某些举例说明等等。
3.修改命令行预处理程序:
修改命令行预处理函数ParseCommand(),使以下命令行(命令与参数间无空格符)可以正确执行:
cd/,cd..,dir/usr.copy/usr/boymail即命令名称与后边的“/”或“..”之间不需要空格也能正确执行。
4.新增fc命令,实现两个文件的比较:
命令形式:
fc<文件名1><文件名2>
5.新增batch命令,实现批处理:
命令形式:
batchbatchfile
命令功能:
从磁盘文件batchfile逐行读入命令行执行,直到batchfile中所有命令行都执行完毕为止。
6.完善copy命令,改善某些缺陷:
正确的功能应该是:
若当前目录中不存在文件boy,则报错;第2个命令若当前目录是根目录,因根目录没有父目录,故应报错;若当前目录的父目录中已经存在名为boy的文件,也报错(或询问用户是否覆盖)。
其他情况上述命令都应能正确执行。
课程设计(上机实习)报告
设计说明书
(说明书的撰写要求请参看封里的“报告填写说明3”。
篇幅不够可附页)
1.修改md命令
流程图如下:
课程设计(上机实习)报告
设计思想:
程序的指令格式为mduser|rh,需改为mduserrh格式,因此可在mduser|rh中修改代码实现修改功能。
要实现此功能,只需要获取目录的属性时删除判断操作符“|”的过程即可。
具体方法:
在GetAttrib函数中删除如下代码:
if(str[0]!
='|')
{
cout<<"\n命令中属性参数错误。
\n";
return-1;
}
修改后的操作方法:
输入 md user rh 即可正确执行
截图如下:
2.修改Help命令
流程图如下:
课程设计(上机实习)报告
设计思想:
利用switch(n)case…语句实现选择只查看需了解的操作命令。
具体方法:
首先利用cout语句输出改操作系统所拥有的命令.并用数字标明,供用户选择,再利用switch(n) case…语句实现具体内容的介绍。
例如:
cout<<"1.create\t";
case1:
cout<<"create<文件名>[<文件属性>]\n"
<<"——创建新文件,文件属性是r、h或s。
\n";
break;
运行效果如下:
3.修改命令行预处理程序
流程图如下:
设计思想:
在命令行预处理函数ParseCommand()中进行修改,使以下命令行(命令与参数间无空格符)可以正确执行:
cd/,cd..,dir/usr,copy/usr/boymail
具体方法:
在ParseCommand()处理cd/,dir/usr等情况的代码中增加处理“.”的代码。
for(i=0;comd[0][i]!
='\0';i++){
if(comd[0][i]=='/')//处理cd/,dir/usr等情况
break;
elseif(comd[0][i]=='.'&&comd[0][i+1]=='.')
break;
}
4.新增fc命令,实现两个文件的比较
流程图如下:
设计思想:
首先利用ProcessPath()函数和FindFCB()函数查找文件的目录所在首块号和文件所在首块号,判断其存在性,并记录其全路径名。
如果需要比较的文件都存在的话则进行比较。
具体实现:
intFcComd(intk)
{
if(k!
=2)
{
cout<<"出错:
输入命令格式错误,请重新输入"<returnfalse;
}
shortinti,j=0,s1,s2,size1,size2,s,s3;
charattrib='\0',*FileName,*FileName1,Buffer1,Buffer2;
FCB*fcbp,*fcbp1,*fcbp2;
s=ProcessPath(comd[1],FileName,k,0,'\20');//取FileName所在目录的首块号
if(s<1)//路径错误
returns;//失败,返回
s1=FindFCB(FileName,s,attrib,fcbp);//取FileName的首块号(查其存在性)
fcbp1=fcbp;
if(s1<0)
{
cout<<"\n要比较的文件不存在。
\n";
return-1;
}
s3=ProcessPath(comd[2],FileName1,k,0,'\20');//取FileName1所在目录的首块号
if(s3<1)//路径错误
returns3;//失败,返回
s2=FindFCB(FileName1,s3,'\40',fcbp);//取FileName的首块号(查其存在性)
fcbp2=fcbp;
if(s2<0)
{
cout<<"\n要比较的文件不存在。
\n";
return-2;
}
size1=fcbp1->Fsize;//取文件一的长度
size2=fcbp2->Fsize;//取文件二的长度
if(size1==0&&size2||size2==0&&size1)
{
cout<<"两个文件的长度不同:
"<cout<<"文件"<FileName<<"的长度"<cout<<"文件"<FileName<<"的长度"<cout<<"两文件在第一个字节处不同";
returnfalse;
}
while(s1>0&&s2>0)
{
for(i=0;i{
if(j==size1&&j==size2)break;
Buffer1=Disk[s1][i];//读第一个文件内容
Buffer2=Disk[s2][i];//读第二个文件内容
if(Buffer1!
=Buffer2)//比较
{cout<<"文件"<FileName<<"长度为:
"<cout<<"文件"<FileName<<"长度为:
"<cout<<"第一个不同字节的位置为第"<cout<<"此时两个文件的字符分别为"<returnfalse;
}
}
if(i}
if(j==size1&&j==size2)
{
cout<<"两文件内容相同"<cout<<"文件长度为:
"<returntrue;
}
return1;
}
效果图如下:
5.新增batch命令,实现批处理
流程图如下:
设计思想:
batch命令从磁盘文件batchfile逐行读入命令行执行,直到batchfile中所有命令行都执行完毕为止。
具体方法:
intBatchComd(intk)
{
shorti,s,size,jj=0,x=0,y=0;
charattrib='\0',*FileName;
chargFileName[PATH_LEN];//存放文件全路径名
FCB*fcbp;
if(k!
=1)
{
cout<<"\n命令参数中应该只有一个文件名。
\n";
return-1;
}
else
{
s=ProcessPath(comd[1],FileName,k,0,'\020');//取FileName所在目录的首块号
if(s<1)//路径错误
returns;//失败,返回
}
s=FindFCB(FileName,s,attrib,fcbp);//取FileName的首块号(查其存在性)
strcpy(gFileName,temppath);
i=strlen(temppath);
if(temppath[i-1]!
='/')
strcat(gFileName,"/");
strcat(gFileName,FileName);//构造文件的全路径名
if(s<0){
cout<<"\n文件"<\n";
return-3;
}
if(s==0)
cout<<"\n文件"<else{
size=fcbp->Fsize;
charBuffer[100][50];//分配动态内存空间
while(s>0){
for(i=0;iif(jj==size)
break;
if(Disk[s][i]=='\n'){
Buffer[x][y]='\0';
cout<x++;
y=0;
}
else{
Buffer[x][y]=Disk[s][i];
y++;
}
}
if(i{
Buffer[x][y]='\0';
break;
}
s=FAT[s];
}
for(i=0;