操作系统实习报告书.docx
《操作系统实习报告书.docx》由会员分享,可在线阅读,更多相关《操作系统实习报告书.docx(31页珍藏版)》请在冰豆网上搜索。
操作系统实习报告书
2009学年—2010学年第2学期
操作系统
实习报告书
目录
一.实习步骤………………………………………………………………………3
二.技术方案………………………………………………………………………4
1.主要功能介绍…………………………………………………………………4
2.实现编译平台介绍……………………………………………………………4
3.详细设计………………………………………………………………………4
4.结构说明………………………………………………………………………6
三.结果………………………………………………………………………7
1.实习程序的使用说明书………………………………………………………7
2.重要函数功能说明及流程图:
………………………………………………6
3.运行结果…………………………………………………………………………21
四.分析………………………………………………………………………28
1.总结………………………………………………………………………………28
2.存在的问题……………………………………………………………………29
实习内容:
基于shell的形式来模拟文件系统
实习环境:
VisualStudio6.0C++/VisualStudio2005
一.实习步骤
1.前期讨论实现方法及设计方案
2.任务分工
二.技术方案
1.主要功能介绍
1)盘符切换:
可以更改当前的磁盘,根据用户输入的盘符,转到相应的磁盘下;
2)cd:
显示当前目录的名称或将其更改,cdA:
\B,进入B目录。
3)chdir:
显示当前目录的名称,当后面没有任何符号时,显示显示当前目录中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表;
4)copy:
将文件复制到另一个位置.
5)dir:
显示一个目录中的文件和子目录,当后面没有任何符号时,显示显
示当前目录中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表;
6)mkdir:
创建指定路径下的子目录
7)more:
逐屏显示输出的内容。
8)move:
将文件移动到另一个位置。
9)rmdir:
将指定的文件或目录删除
10)help:
帮助,显示所能进行的操作
2.实现编译平台及运行平台
在windowsXP、windowsVista、windows7下运行平台式VisualStudioC++6.0及VisualStudio2005
3.详细设计
1)首先创建文件A,并对A进行初始化,A中包含B、C目录,B目录下有十个a[i]文件。
并将刚刚初始化好的A中的信息用writein()写进A文件。
2)实现命令的解析:
a)用getline()函数获得用户输入的命令;
b)定义全局变量stringorder和stringobj分别存放当前命令和操作路径
c)以””为分隔符,用循环的方式分割出当前命令和操作路径。
d)判断当前命令与存在命令是否相符,若相符实现相应函数,若不相符,出现不存在命令的提示。
3)voidhelp()函数打印帮助信息,打印内容包括有哪些命令以及各个命令如何使用。
若只输入help命令,则进入到stringlline==help的函数中。
若除了输入help命令还输入相应命令,则通过之后一系列helpcd()之类的特定帮助函数用来对特定功能进行帮助。
4)cd命令的实现。
用path存放当前路径,将输入路径打印出来。
若只输入cd而没有输入路径,则系统显示当前路径继续服务。
并通过seekp函数将指针定位到A中当前cd之后的内容。
5)voiddir()列出目录下的所有文件及文件夹:
a)当解析当order为dir时,进入dir函数。
b)将传过来的参数s变成s\,在Path[]中寻找s\,通过字符串函数提取判断,若找到并且Path[]中s\之后的所有字符串中不再有\出现时,则将此路径之后的所有内容显示。
c)显示时用seekp函数定位到已找到的相应位置,并把该位置之后的信息内容全部显示出来。
d)定位时,要用循环,将之前所有的内容的总长度相加存入sum,将指针定位到sum+1。
6)voidmkdir(stringobj1,stringobj2)创建新文件或目录:
a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
Obj1存放的是当前要创建的文件或目录的路径及名称,obj2存放的是创建的对象的属性,即是文件还是目录。
b)在Path[]中寻找obj1,若找到,则说明要创建的对象已经存在,不能再创建,若没有找到,则可以创建。
c)若要创建的对象不存在,则对其各个对象进行编写,同时,将刚创建的对象的路径存入Path[],将刚创建的对象存入total[]。
d)用writein()函数对磁盘空间进行整理。
7)voidmore(stringch)逐屏显示输出。
调用more()函数实现。
完成判断,定位,打印输出的过程。
8)voidcopy(stringobj1,stringobj2)
a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
Obj1存放的是当前要复制的对象的路径及名称,obj2存放的是要复制到的路径。
b)obj1和obj2相等,则提示对象自身不能复制。
c)若obj1和obj2不相等,则进行复制,复制时要对路径进行修改,并对Path[]和total[]进行相应添加。
d)writein()磁盘空间整理。
9)voidrmdir(stringstr)可以删除一个目录或者文件,调用rmdir()函数。
10)voidmove(stringobj1,stringobj2)移动目录或文件
a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
Obj1存放的是当前要移动的对象的路径及名称,obj2存放的是要移动到的路径。
b)首先判断,若obj1和obj2相等,则提示对象不能自身移动。
c)若通过判断,则首先将obj1复制到obj2下(使用copy()中的命令),再将obj1删除(使用rmdir()中的命令)。
11)voidrename(stringobj1,stringobj2)修改文件名或目录名
a)在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
Obj1存放的是当前要修改的对象的路径及名称,obj2存放的是要修改成的路径及名称。
b)调用rename()函数。
12)voidmain()负责调用相应的函数满足用户的需求:
a)首先打印信息cout<<"Shell-AboveWindows7[Ver1.0]\n";cout<<"(C)Copyright2010zx_wql_djy.\n\n";输出当前磁盘cout<<"A:
\\>";
b)根据order和obj调用相应的函数。
4.结构说明
定义String型字符串,order存放当前命令,obj存放当前操作路径,path存放当前路径:
stringorder="",obj="",path="";
charPath[maxdir][20];//存放所有路径
定义文件结构体childfile,具有五个属性:
文件内容、属性(文件或目录)、路径、文件长度、文件名。
typedefstructchildfile{//childfile*pfirst[maxdir];
stringcontent;//文件内容
stringattribute;//属性:
目录文件
stringppath;//路径
intlength;//文件长度
stringname;//文件名
}childfile,*pfile;
定义结构体指针,用于进行文件的存取和读写:
pfileA,B,C,D;
pfilea[10];//B目录下的子文件
pfiletotal[maxdir];//存放所有已存在的目录
三.结果
⏹实习程序的使用说明书
1.输入help,显示所能进行的操作。
2.输入cd目录路径显示指定驱动器中的当前目录,不带参数只键入CD则
显示当前驱动器和目录。
3.输入chdir:
显示当前目录的名称,当后面没有任何符号时,显示前目录
中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表;
4.输入dir目录路径显示指定驱动器中的所有文件和子目录
5.输入more目录路径显示当前目录路径下的文件内容
6.输入copy目录路径1目录路径2将“目录路径1”下的内容复制到“目
录路径2
7.输入copy目录路径1目录路径2将文件复制到另一个位置
8.输入rmdir目录路径将指定的文件或目录删除.
9.输入move目录路径1目录路径2将“目录路径1”下的内容移动到“目
录路径2”。
10.输入rename目录路径1修改的目录路径名2将目录路径1修改成2。
⏹整体流程图
⏹流程图和函数说明:
1.Dir()函数:
显示一个目录中的文件和子目录,当后面没有任何符号时,显示显
示当前目录中的文件和子目录列表,如果后边指定相应的目录,则列出对应目录下的文件和子目录表.
Ø解析输入的命令,当存放命令的order字符串中存放的为dir时,调用dir(s)函数。
Ø将传过来的参数s变成s\,将Path[]中的路径存入tpath,通过字符串函数提取判断,若找到并且Path[]中s\之后的所有字符串中不再有\出现时,则将此路径之后的所有内容显示。
if((tpath.find(s,0)=tpath.length()))
{/*如果查找在输入命令行中出现s("\\")的位置比tpath的长度小,并且从此位置向后找到(“\\”)的位置
比tpath.length大或者等于length——即在找到出现\\的i位置后没有子目录*/
intsum=0;
for(intk=0;k
{
sum+=total[k]->attribute.size()+total[k]->content.size()+2+total[k]->name.size()+total[k]->ppath.size();//文件的属性、内容、名字、路径长度相加
}
Ø显示时用seekp函数定位到已找到的相应位置,并把该位置之后的信息内容全部显示出来。
fout.seekg(600+sum+5*i,ios:
:
beg);//定位:
从开始定位到个地址单元+已读取的文件长度+每个文件性质后设置的空格
Ø定位时,要用循环,将之前所有的内容的总长度相加存入sum,将指针定位到sum+1。
流程图如下:
2.COPY:
将文件复制到另一个位置.
voidcopy(stringobj1,stringobj2)
Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
Obj1存放的是当前要复制的对象的路径及名称,obj2存放的是要复制到的路径。
for(i=0;i{
if(Path[i]==obj1)//将obj1赋到Path中
{p1=i;break;}//当前位置记录到p1
}
for(j=0;j{
if(Path[j]==obj2)//将obj2赋到Path中
{p2=j;break;}//当前位置记录到p2
}
Ø判断如果obj1和obj2相等,则提示对象自身不能复制。
f(p1==p2)
cout<<"文件无法自身复制"<Ø若obj1和obj2不相等,则进行复制,复制时要对路径进行修改,并对Path[]和total[]进行相应添加。
elseif(p1!
=-1&&p2!
=-1)
{
pfilecpdir=newchildfile;
cpdir->attribute=total[p1]->attribute;
cpdir->content=total[p1]->content;
cpdir->length=total[p1]->length;
cpdir->name=total[p1]->name;
cpdir->ppath.resize(100);
cpdir->ppath=total[p2]->ppath+"\\"+obj1.substr(obj1.length()-1,1);
total[flag2]=cpdir;
flag2++;
strcat(Path[flag],cpdir->ppath.c_str());//每次将路径存入到path中去,并加
flag++;
writein()磁盘空间整理。
流程图如下:
3.MOVE:
将文件移动到另一个位置
voidmove(stringobj1,stringobj2)移动目录或文件
Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
voidmove(stringobj1,stringobj2)
{
intp1=-1,p2=-1;
inti,j;
for(i=0;i{
if(Path[i]==obj1)
{p1=i;break;}
}
for(j=0;j{
if(Path[j]==obj2)
{p2=j;break;}
}
ØObj1存放的是当前要移动的对象的路径及名称,obj2存放的是要移动到的路径。
Ø首先判断,若obj1和obj2相等,则提示对象不能自身移动。
if(p1==p2)
cout<<"文件无法自身移动"<Ø若通过判断,则首先将obj1复制到obj2下(使用copy()中的命令):
elseif(p1!
=-1&&p2!
=-1)
{
pfilecpdir=newchildfile;//先把obj1复制到obj2
cpdir->attribute=total[p1]->attribute;
cpdir->content=total[p1]->content;
cpdir->length=total[p1]->length;
cpdir->name=total[p1]->name;
cpdir->ppath.resize(100);
cpdir->ppath=total[p2]->ppath+"\\"+obj1.substr(obj1.length()-1,1);
////将输入路径的最后一个字符提取加入到obj1中,并且与ppath字串中的内容链接起来
total[flag2]=cpdir;
flag2++;
strcat(Path[flag],cpdir->ppath.c_str());//将路径存入到Path中去(将字符串接到Path【flag】后面)
flag++;
Ø再将obj1删除(使用rmdir()中的命令)。
for(inti=0;i{
if(strcmp(obj1.c_str(),Path[i])==0)
{
for(intj=i;j{
total[j]=total[j+1];
for(intk=0;k<20;k++)
Path[j][k]=Path[j+1][k];
}
}
}
writein();//磁盘空间整理
流程图如下:
4.More:
逐屏显示输出的内容
调用more()函数实现。
完成判断,定位,打印输出的过程。
Ø首先判断路径存在,则找到相应的位置,读出件的属性、内容、名字、路径、长度信息
for(intk=0;k
{
sum+=total[k]->attribute.size()+total[k]->content.size()+2+total[k]->name.size()+total[k]->ppath.size();//文件的属性、内容、名字、路径长度相加
}
Ø使用seekp函数定位到已找到的相应位置,并把该位置之后的信息内容全部显示出来。
fout.seekg(600+sum+5*i,ios:
:
beg);//从开始定位到600个地址单元+已读取的文件长度+每个文件性质后设置的空格
5.Writein:
磁盘整理程序,将文件重新写入A中
voidwritein()
打开文件A,循环向Path中写入20个字符,如果目录指针total【】中有内容,则将total的五个信息分别写入文件中。
fout.open("A",ios:
:
out|ios:
:
binary);
for(inti=0;i{
fout.write((char*)Path[i],20);//将Path写到A中向文件中写入个字符
}
for(inti=0;i{
if(total[i])//如果total存在,就将total的信息写到A中
{
fout<ppath;
fout<<"";
fout<name;
fout<<"";
fout<attribute;
fout<<"";
fout<content;
fout<<"";
fout<length;
fout<<"";
}
流程图如下:
6.Mkdir:
创建指定路径下的子目录
Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
Obj1存放的是当前要创建的文件或目录的路径及名称,obj2存放的是创建的对象的属性,即是文件还是目录。
Ø在Path[]中寻找obj1,若找到,则说明要创建的对象已经存在,不能再创建,若没有找到,则可以创建。
for(inti=0;i{
if(strcmp(Path[i],obj1.c_str())==0)
{
cout<<"您输入的路径已存在"<p=1;
}
}
Ø若要创建的对象不存在,则对其各个对象进行编写,同时,将刚创建的对象的路径存入Path[],将刚创建的对象存入total[]。
if(p==0)
{
D=newchildfile;
D->ppath=obj1;//存放名称
D->name=obj.substr(obj1.length()-1,1);//将输入路径的最后一个字符提取加入到obj1中,(从obj.length-1开始的一个字符)
D->attribute=obj2;//文件属性
D->length=sizeof(childfile);//子文件的长度
D->content="%%";//存放目录内容
total[flag2]=D;//结构体指针指向D
flag2++;
strcat(Path[flag],D->ppath.c_str());//将路径存入到Path中去(将字符串接到Path【flag】后面)
flag++;
writein();//磁盘空间整理
cout<"<}
7.Rename:
修改文件名或目录名
Ø在执行该命令之前,要将obj用“”分割开,分为obj1和obj2。
Obj1存放的是当前要修改的对象的路径及名称,obj2存放的是要修改成的路径及名称。
Ø调用rename()函数。
Ø解析命令行,用substr得到obj1的最后一个字符既要修改的对象,将obj2中的字符重新赋值给路径,替换原名称。
intp=0;
for(inti=0;i{
if(strcmp(Path[i],obj1.c_str())==0)
{
total[i]->name=obj2.substr(obj1.length()-1,1);//得到输入命令行的最后一个字符赋值给目录存放结构体的名字指针
total[i]->ppath=obj2;//重置路径
strcpy(Path[i],total[i]->ppath.c_str());//将目录存放结构体的内容赋值给路径结构体数组
cout<<"修改成功!
"<writein();//磁盘空间整理
p=1;//判断是否找到路径
}
}
if(p==0)
cout<<"您输入的路径不存在!
"<cout<";
流程图如下:
8.Rmdir:
将指定的文件或目录删除
以删除一个目录或者文件,调用voidrmdir(stringstr)函数.
Ø先解析输入的命令行内容,当读取的字符串内容与Path[]内容一致时找到路径位置;
Ø使用循环将目录里的文件列表移动覆盖原位置的信息;
Ø最后更新Path[]中的内容。
Ø进行磁盘空间整理调用Writein函数。
for(inti=0;i{
if(strcmp(str.c_str(),Path[i])==0)//定位找到删除位置i
{
for(intj=i;j{
total[j]=total[j+1];//后一位置前移
for(intk=0;k<20;k++)
Path[j][k]=Path[j+1][k];//后一位置前移
}
cout<<"删除成功!
"<p=1;
}
流程图如下:
⏹运行结果
1.运行开始界面
2.输入help命令显示所有命令信息
3.Cd命令实现
4.返回上一级目录
5.Dir命令
6.Mkdir命令
7.More命令
8.Copy命令
9.Rmdir命令
10.Move命令
11.Rename命令
12.退出程序
13.健壮性考虑
四.分析
1.总