OS课程设计实验报告.docx
《OS课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《OS课程设计实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
![OS课程设计实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/24/f5346214-c424-4bbd-8580-d970d6c37017/f5346214-c424-4bbd-8580-d970d6c370171.gif)
OS课程设计实验报告
计算机与信息学院
操作系统课程设计报告
专业班级
计算机科学与技术08-5班
学生姓名及学号
邹纯纯20082681
课程教学班号
任课教师
刘晓平、李琳、田卫东
实验指导教师
李琳
实验地点
逸夫楼507
2010~2011学年第二学期
目录
第1章课程设计任务、要求、目的............3
第2章原理及算法描述......................3
第3章开发环境............................4
第4章重要算法和设计思路描述..............4
第5章程序实现---数据结构.................7
第6章程序实现---程序清单.................8
第7章总结................................24
第8章参考文献............................24
第一章课程设计任务、要求、目的
1.1课程设计任务
本次课程设计的任务是在windows环境下实现兼容Unix/Linux操作系统的命令接口,并实现一些指定的命令功能。
1.2课程设计要求和目的
1、为Windows操作系统建立一个兼容Unix命令的命令接口;
2、实现命令包括ls,cat,cp,mv,md,rd,cd,sort,more,print,命令的内容
与详细格式请查阅unix命令手册;
3、可以字符形式接收命令,执行命令,然后显示命令执行结果。
第二章原理及算法描述
计算机的操作我们通常使用的是windows操作系统,在windows2000以上的版本中,我们只需在“搜索程序和文件”选项框中输入cmd命令进入windows操作系统中就可以达到实现系统相关功能的目的。
同样在Unix和Linux操作平台中,也可以实现相关命令以完成操作系统的相关操作。
现在我们必须实现这样一种方法,即为windows操作系统建立一个兼容Unix命令的命令接口。
在主程序中新建一个Windows_Unix.exe文件,然后调用相关实现相关Unix命令的函数实现命令功能。
具体命令的实现主要通过系统的API函数调用与之功能相同或相似的Dos命令,这样就可以实现在Windows操作系统中虚拟地实现Unix命令。
第三章开发环境
1、硬件环境:
微型计算机。
2、软件环境:
Windows7操作系统,语言环境为VisualC++6.0。
第4章重要算法和设计思路描述
1、实验要实现的Unix命令包括ls、cat、cp、mv、md、rd、cd、sort、more、print等。
2、Unix常用指令功能内容:
(1)ls
ls的意义为"list",实现显示指定目录中的文件和子目录。
如果你在下ls指令后面没有跟著任何的文件名或目录名,则会显示出当前目前目录中所有文件信息。
(2)Cat
Cat指令实现指定目录中文件,打开文件并显示其中的内容的功能,当要打开的文件无效时会返回打开文件失败。
(3)cp
cp是复制("COPY"),也就是将一个或多个文件复制成另一个文件或者是将其复制到另一个目录去,另外可以对要复制的目标文件进行重命名操作。
(4)mv
md[drive:
][path]\n
mv的意义为move,主要是实现将文件从一个目录移到另一个目录。
(5)md
md实现在指定的目录或文件下创建目录。
(6)rd
Rd实现删除当前指定的内容为空的目录,若当前目录不为空则无法进行删除目录操作。
(7)cd
Cd指令实现显示当前目录的名称或将其更改。
程序中我设定的是Cd-s为显示当前目录,而cd[...]\n,其中...为要父目录,即指定要切换到的目录。
(8)sort
Sort指令实现对指定文件中的所有的行进行排序,并将结果标准输出。
排序的算法可以是按升序或按降序进行排列。
(9)more
More实现将指定超过一页的文件临时停留在屏幕,等按任何的一个键后才继续显示。
(10)print
print指令实现对指定的文件连接当前计算机的打印设备进行打印操作。
除了上述的实验要求的命令,为了便于操作和命令的使用查询,我另外设置了以下指令:
"help:
提供帮助信息。
\n"\
"命令+--help:
提供命令的详细操作信息。
\n"\
"exit:
退出命令解释程序。
\n"\
3、设计思路
(1)voidlsFunction(string*lsinput,intlscount)函数实现显示一个目录中的文件和子目录。
如果失败返回显示“路径可能不存在!
”。
(2)voidcatFunction(string*catinput,intcatcount)函数实现打开文件并显示内容。
如果失败返回显示“无法打开文件!
”。
(3)voidcpFunction(string*cpinput,intcpcount)函数实现复制文件和目录树。
如果成功返回显示“复制成功”,否则显示“文件或目录可能不存在!
”。
(4)voidmvFunction(string*mvinput,intmvcount)函数实现将文件从一个目录移到另一个目录。
如果成功返回显示“成功”,否则显示“文件或目录可能不存在!
”。
(5)voidmdFunction(string*mdinput,intmdcount)实现在指定的目录或文件下创建目录。
(6)voidrdFunction(string*rdinput,intrdcount)函数实现删除空目录。
如果成功返回显示“删除目录成功”,否则显示“文件夹可能不存在或文件夹不为空!
”。
(7)voidcdFunction(string*cdinput,intcdcount)函数实现显示当前目录的名称或将其更改。
如果失败返回显示“路径可能不存在!
”。
(8)voidsortFunction(string*sortinput,intsortcount)指令实现对指定文件中的所有的行进行排序,并将结果标准输出。
排序的算法可以是按升序或按降序进行排列。
(9)voidmoreFunction(string*moreinput,intmorecount)实现将指定超过一页的文件临时停留在屏幕,等按任何的一个键后才继续显示。
(10)voidprintFunction(string*printinput,intprintcount)实现对指定的文件连接当前计算机的打印设备进行打印操作。
(11)voidhelpFunction()函数实现提供Windows命令的帮助信息。
如果失败返回显示“命令语法不正确”。
(12)voidexitFunction()函数实现退出命令解释程序。
(13)voidprintPath()函数实现显示当前操作的目录路径。
(14)在主函数intmain()中通过输入具体的Unix命令来判断进入何种函数实现相应的功能。
此外在命令名后加入--help,可以调出相应命令的使用说明。
第5章程序实现---数据结构
是exit指令
判断不是exit命令
ls()
cat()
cp()
mv()
md()
rd()
cd()
sort()
more()
print()
第六章程序实现---程序清单
程序清单:
#include"windows.h"
#include"fstream"
#include"string"
#include"iomanip"
#include"iostream"
usingnamespacestd;
#definePRINTHEADHELP
"===========================================================================
====="\
"\tOS课程设计——操作系统接口:
兼容Unix/Linux命令接口\n"\
"要求:
\n"\
"1、为Windows操作系统建立一个兼容Unix命令的命令接口;\n"\
"2、实现命令包括ls,cat,cp,mv,md,rd,cd,sort,more,print等命令的内容与详细格式请查阅"\
"unix命令手册;\n"\
"3、可以字符形式接收命令,执行命令,然后显示命令执行结果;\n"\
"===========================================================================
====="\
#definePRINTHELP"有关每个命令的详细信息,请键入'命令--help'。
\n"\
"ls显示指定目录中的文件和子目录。
\n"\
"cat打开文件并显示内容。
\n"\
"cp复制文件和目录树。
\n"\
"mv将文件从一个目录移到另一个目录。
\n"\
"md创建目录\n"\
"rd删除空目录。
\n"\
"cd显示当前目录的名称或将其更改。
\n"\
"sort对指定文件中的所有的行进行排序,并将结果标准输出
。
\n"\
"more超过一页的文件临时停留在屏幕,等按任何的一个键
后才继续显示。
\n"\
"print打印。
\n"\
"help提供帮助信息。
\n"\
"命令+--help提供命令的详细操作信息。
\n"\
"exit退出命令解释程序。
\n\n"\
"有关工具的详细信息,请参阅联机帮助中的命令行参考。
\n\n"\
#definePRINTLSHELP"显示目录中的文件和子目录列表。
\n"\
"ls[drive:
][path][filename][+?
]\n"\
"[drive:
][path][filename]\n"\
"显示要列出的驱动器、目录或文件。
\n"\
#definePRINTCATHELP"打开文件并显示内容。
\n"\
"cat[drive:
][path]dirname1"\
#definePRINTCPHELP"复制文件和目录树。
\n"\
"cpsource[destination]\n"\
"source指定要复制的文件。
\n"\
"destination指定新文件的位置或名称。
\n"\
#definePRINTMVHELP"将文件从一个目录移到另一个目录。
\n"\
"移动:
mv[drive:
][path]dirname1destination\n"\
"重命名:
mv[drive:
][path]dirname1dirname2\n"\
#definePRINTMDHELP"创建目录。
\n"\
"md[drive:
][path]\n"\
#definePRINTRDHELP"删除目录。
\n"\
"RMDIR[/S][/Q][drive:
]path\n"\
"RD[/S][/Q][drive:
]path\n"\
#definePRINTCDHELP"显示当前目录名或改变当前目录。
\n"\
"cd-s:
显示[drive:
][path][+?
]\n"\
"cd[...]\n"\
"...指定要改成父目录。
\n"\
#definePRINTSORTHELP"对指定文件中的所有的行进行排序,并将结果标准输出。
\n"\
"sortsource\n"\
"source指定要进行行排序的文件\n"\
#definePRINTMOREHELP"使超过一页的文件临时停留在屏幕,等按任何的一个键后才继续显示。
\n"\
"moresource\n"\
"source指定要进行显示的文件\n"\
#definePRINTPRINTHELP"将文件打印出来。
\n"\
"printsource\n"\
"source指定要进行打印的文件\n"\
//------1、ls
voidlshelpFunction()
{
cout<}
voidlsFunction(string*lsinput,intlscount)
{
voidprintPath(void);
if(1==lscount)
{
HANDLEhandle;
charfc[50];
FILETIMElpCreationTime,lpLastAccessTime,lpLastWriteTime;
SYSTEMTIMEstime;
WIN32_FIND_DATA*fd=newWIN32_FIND_DATA();
if(!
:
:
GetCurrentDirectory(50,fc))
cout<<"路径可能不存在!
"<strcat(fc,"\\*.*");
if((handle=FindFirstFile(fc,fd))!
=INVALID_HANDLE_VALUE)
{
do{
HANDLEhDir=CreateFile(fd->cFileName,GENERIC_READ,
FILE_SHARE_READ|
FILE_SHARE_DELETE,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
if(GetFileTime(hDir,&lpCreationTime,&lpLastAccessTime,
&lpLastWriteTime))
{
FILETIMEftime;
FileTimeToLocalFileTime(&lpLastWriteTime,&ftime);//转换成本
地时间
FileTimeToSystemTime(&ftime,&stime);//转换成系统时间格式
}
cout<cout<(2)<(2)
<(2)<"<(2)
<cout<<""<cFileName<CloseHandle(hDir);
}while(FindNextFile(handle,fd));
}
FindClose(handle);
printPath();
}
elseif(lscount==2)
{
if(lsinput[1]=="?
")
cout<else
{
HANDLEhandle;
charfc[50],fe[50];
FILETIMElpCreationTime,lpLastAccessTime,lpLastWriteTime;
SYSTEMTIMEstime;
WIN32_FIND_DATA*fd=newWIN32_FIND_DATA();
if(!
:
:
GetCurrentDirectory(50,fc))
{
cout<<"路径可能不存在!
"<}
if(!
SetCurrentDirectory(lsinput[1].c_str()))
{
cout<<"路径可能不存在!
"<}
if(!
:
:
GetCurrentDirectory(50,fe))
{
cout<<"路径可能不存在!
"<}
strcat(fe,"\\*.*");
if((handle=FindFirstFile(fe,fd))!
=INVALID_HANDLE_VALUE)
{
do{
HANDLEhDir=CreateFile(fd->cFileName,GENERIC_READ,
FILE_SHARE_READ|
FILE_SHARE_DELETE,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
if(GetFileTime(hDir,&lpCreationTime,&lpLastAccessTime,
&lpLastWriteTime))
{
FILETIMEftime;
FileTimeToLocalFileTime(&lpLastWriteTime,&ftime);//
转换成本地时间
FileTimeToSystemTime(&ftime,&stime);//转换成系
统时间格式
}
cout<cout<(2)
<(2)<<
stime.wDay<<""<(2)
<"<(2)<cout<<""<cFileName<CloseHandle(hDir);
}while(FindNextFile(handle,fd));
}
FindClose(handle);
if(!
SetCurrentDirectory(fc))
cout<<"路径可能不存在!
"<}
printPath();
}
}
//------2、cat
voidcathelpFunction()
{
cout<}
/*//单独显示打开文件地址
stringcatFunction()
{
stringfile_name;
cout<<"请输入完整源文件名(包括路径和后缀名):
";
cin>>file_name;
ifstreaminfile(file_name.c_str(),ios:
:
in);//openfilewiththewayofinput
if(!
infile)
{
cout<<"无法打开文件"<";
}
charf[2000];
infile.getline(f,2000,EOF);
cout<<"______________________________________________________________________________"<cout<cout<<"______________________________________________________________________________"<infile.close();
returnf;
}*/
voidcatFunction(string*catinput,intcatcount)
{
voidprintPath(void);
if(1==catcount)
{
cout<<"命令语法不正确!
"<printPath();
}
if(2==catcount)
{
ifstreaminfile(catinput[1].c_str(),ios:
:
in);
if(!
infile)
{
cout<<"无法打开文件"<"<gotoL;
}
charf[2000];
infile.getline(f,2000,NULL);//EOF
cout<<"________________________________________________________________________________";
cout<cout<<"________________________________________________________________________________";
L:
infile.close();
printPath();
}
}
//------3、cp
voidcphelpFunction()
{
cout<}
voidcpFunction(string*cpinput,intcpcount)
{
//cpcount=3-->cp源文件路径目的文件路径
//另外在copy的过程可以进行重命名操作,即cpinput[2].c_str()
voidprintPath(void);
if(1==cpcount)
{
cout<<"命令语法不正确!
"<printPath();
}
else
{
if(!
CopyFile(cpinput[1].c_str(),cpinput[2].c_str(),1))
{
cout<<"文件或目录可能不存在t!
"<printPath();
}
else
{
cout<<"复制文件成功!
"<printPath();
}
}
}
//------4、mv
voidmvhelpFunction()
{
cout<}
voidmvFunction(string*mvinput,intmvcount)
{
voidprintPath(void);
if(1==mvcount)
{
cout<<"命令语法不正确!
"<printPath();
}
elseif(mvcoun