操作系统课程设计实验报告
专业班级
计算机科学与技术
学生姓名及学号
课程教学班号
0001班
任课教师
实验指导教师
实验地点
2009 ~2010 学年第二学期
计算机与信息学院
(一)课程设计任务、要求、目的:
操作系统接口:兼容Unix/Linux命令接口。(2人)4分
●为Windows操作系统建立一个兼容Unix命令的命令接口;
●实现命令包括ls,cat,cp,mv,md,rd,cd,sort,more,print,命令的内容与详细格式请查
阅unix命令手册;
●可以字符形式接收命令,执行命令,然后显示命令执行结果;
(二)原理及算法描述:
通过visual C++6.0中自带的system()函数将输入的Unix命令转换成windows
dos系统下相对应的命令,进行执行即可完成Unix命令的操作。
Unix命令在dos中对应的命令如下:
◆语法
显示目录或文件名的内容
ls -f [ -C ] [ -d ] [ -i ] [ -m ] [ -s ] [ -x ] [ -1 ] [ Directory ... ]
描述:
ls 命令将每个由Directory 参数指定的目录或者每个由File 参数指定的名称写到标准输出,以及您所要求的和标志一起的其它信息。如果不指定File 或Direct ory 参数,ls 命令显示当前目录的内容。
当ls 命令显示目录内容时,它不显示名称以.(点)开头的文件项,除非使用了-a 或者-A 标志。如果命令由root 用户执行,它缺省使用-A 标志。
◆函数实现
void ls(string *lsinput,int lscount)
{
string result="dir "+lsinput[1];
if(lscount == 1)
{
system("dir");
}
else if(lscount == 2){
if(lsinput[1] == "+?" )
cout< else{ char fc[200]; if(!::GetCurrentDirectory(200,fc)) { cout<<"路径可能不存在!"< return; } if(!SetCurrentDirectory(lsinput[1].c_str())) { cout<<"路径可能不存在!"< return; } system(result.c_str()); } } } (2)cat ◆语法 cat text 显示text这个文件; cat file1 file2 依顺序显示file1,file2的内容; cat file1 file2>file3 把file1,file2的内容结合起来,再“重定向(>)”到file3文件中。 ◆函数实现 void cat(string *catinput,int catcount) { string file_name,s; if(catcount == 2) { if(catinput[1] == "+?" ) { cout< } else { file_name=catinput[1]; ifstream input(file_name.c_str(),ios::in); if (!input) { cout<<"无法打开文件 "< return; } cout< while(!input.eof()) { getline(input,s); cout< } } } } (3)cp ◆语法 在Linux中CP的功能是将文件和目录从一个文件拷贝到另一个目录常用参数:-i、-f、-r -i:当目录文件存在时。系统提示直接拷贝 -f:目标文件存在时不给提示直接拷贝 -r:拷贝这个目录及目录里的富有文件和子目录 Cp索引(Cp index) ◆函数实现 void cp(string *cpinput,int cpcount) { if(cpcount == 2) { if(cpinput[1] == "+?" ) { cout< } } else if(cpcount == 3) { string result="copy "+cpinput[1]+" "+cpinput[2]; if(system(result.c_str())) cout<<"文件或目录可能不存在!"< else cout<<"复制成功"< }} (4)rm ◆语法 用户可以用rm命令删除不需要的文件。该命令的功能问删除一个目录中的一个或多个文件或目录,他也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,源文件保持不变。 ◆函数实现 void rm(string *rminput,int rmcount) { string result="del "+rminput[1]; if(rmcount == 2) if(rminput[1] == "+?") cout< else if(system(result.c_str())) cout<<"文件可能不存在!"< else cout<<"删除成功"< } (5)mv ◆语法:mv[选项]源文件或目录目标文件或目录 用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同MS-DOS下的ren 和move 的组合 ◆函数实现 void mv(string *Moveinput,int Movecount) { string result="move "+Moveinput[1]+" "+Moveinput[2]; string result1="move "+Moveinput[1]; if(Movecount == 2) { if(Moveinput[1] == "+?") { cout< } system(result1.c_str()); } else if(Movecount == 3) { if(system(result.c_str())) cout<<"文件或目录可能不存在!"< else cout<<"移动成功"< } } (6)mkdir ◆语法:mkdir [选项] dir-name 功能:创建一个目录(类似MSDOS下的md命令)。 说明:该命令创建由dir-name命名的目录。要求创建目录的用户在当前目录中(dir-name的父目录中)具有写权限,并且dirname不能是当前目录中已有的目录或文件名称。 ◆函数实现 void mkdir(string *mkdirinput,int mkdircount) { string result="mkdir "+mkdirinput[1]; if(mkdircount != 2) cout<<"命令语法不正确!请使用mkdir+?查询正确格式"< else if(mkdircount == 2){ if(mkdirinput[1] == "+?") cout< else if(system(result.c_str())); else cout<<" 创建目录成功"< } } (7)rmdir ◆语法:int rmdir(char *stream); 功能: 删除DOS文件目录 ◆函数实现 void rmdir(string *rmdirinput,int rmdircount) { string result="rmdir "+rmdirinput[1]; if(rmdircount != 2) cout<<"命令语法不正确!请使用rmdir+?查询正确格式"< else if(rmdircount == 2) if(rmdirinput[1] == "+?") cout< else system(result.c_str()); else cout<<" 删除目录成功"< } (8)help ◆语法 显示帮助信息 ◆函数实现 void help(string *helpinput,int helpcount) { if(helpcount == 1) cout< else cout<<"命令语法不正确!"< } (9)cd ◆语法 功能:更改当前目录。 cd [directory] 或者cd [directorya directoryb] ◆函数实现 void cd(string *cdinput,int cdcount) { string result="cd "+cdinput[1]; if(cdcount == 1) system("cd "); else if(cdcount == 2){ if(cdinput[1] == "+?") cout< else if(!SetCurrentDirectory(cdinput[1].c_str())) cout<<"路径可能不存在!"< } } (10)sort ◆语法 主要用于排序文件、对已排序的文件进行合并,并检查文件以确定它们是否已排序sort 命令对File 参数指定的文件中的行排序,并将结果写到标准输出。如果File 参数指定多个文件,那么sort 命令将这些文件连接起来,并当作一个文件进行排序。-(减号)代替文件名指定标准输入。如果您不指定任何文件名,那么该命令对标准输入排序。可以使用-o 标志指定输出文件。 ◆函数实现 void sort(string *sortinput,int sortcount) { string result="sort "+sortinput[1]; if(sortcount != 2){ cout<<"格式不正确!请使用sort+?查询正确格式"< } else if(sortcount == 2){ if(sortinput[1] == "+?"){ cout< return; } else system(result.c_str()); } } (11)more ◆语法:more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..] 类似cat ,不过会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与vi 相似),使用中的说明文件,请按h 。 ◆函数实现 void more(string *moreinput,int morecount) { string result="more "+moreinput[1]; if(morecount != 2){ cout<<"格式不正确!请使用more+?查询正确格式"< } else if(morecount == 2){ if(moreinput[1] == "+?"){ cout< return; } else system(result.c_str()); } } (12)print ◆语法:Print(printjobnumber,{tab1,}string{,tab2}) 以当前字体在打开的打印作业中打印一行或多行文本。 ◆函数实现 void print(string *printinput,int printcount) { string result="print "+printinput[1]; if(printcount != 2){ cout<<"格式不正确!请使用print+?查询正确格式"< } else if(printcount == 2){ if(printinput[1] == "+?"){ cout< return; } else system(result.c_str()); } } (三)开发环境 Visual C++ 6.0环境下进行编程实现 (四)重要算法和设计思路描述 在主函数中设置一个字符串数组,其中第一个存储空间用来存放输入的Unix 命令,第二个存储空间用来存放输入的第一个文件名称,第三存储空间用来存放 输入的第二个文件名称(如果有第二个文件,则使用)。然后将第一个存储空间 的字符串与相应的unix命令做比较,找到相应的转换函数,然后调用该函数即 可实现所要完成的任务。 在这里我们拿cp命令来举例说明一下:在Unix中,cp命令是用来复制文件和根目录,其格式为cat 文件名1 文件名2 ;当输入cp a.txt b.txt 时,cp 命令存放在str[0]中,a.txt存放在str[1]中,b.txt将存放在str[2]中。将str[0]中 的内容与所有Unix的命令字符串做比较,找到相等的字符串,然后在调用相应 的函数。在这里则调用cp(string *cpinput,int cpcount)函数,在本函数中,由于 在DOS环境下的复制文件和根目录的命令也是用copy字符串表示,因此需要 做相应的转换,将输入的cp a.txt b.txt字符串转换成copy a.txt b.txt,b,并将其赋 值给result变量。并用syste(result.c_str())函数来执行。即可完成Unix中cp命 令的任务。 (五)程序实现—数据结构 字符串数组 (六)总结 通过本次课程设计,首先是对Linux下的常用操作命令如ls,cat,cp,mv,md,rd,cd,sort,more,print等有了更深层次的理解,对这些命令的使用也更加熟悉;其次,本实验是通过使用system()函数将Linux的命令转换成windows 下的想用命令,因此对system()函数的使用更加熟悉,尤其是指针字符串的使用; 最后,因为要转换成windows下的相应命令,所以对windows下的命令驾轻就熟。 另外就是因为实现较简单,所以没有明确的分工,基本上是每个人实现一部分命令。 (七)参考文献 《Linux命令行技术大全》人民邮电出版社 《Linux 标准教程》清华大学出版社