当前位置:文档之家› 操作系统课程设计实验报告

操作系统课程设计实验报告

操作系统课程设计实验报告
操作系统课程设计实验报告

操作系统课程设计实验报告

专业班级

计算机科学与技术

学生姓名及学号

课程教学班号

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 标准教程》清华大学出版社

相关主题
文本预览
相关文档 最新文档