在linux环境下模拟实现命令解释器。
年级08级
专业班级: 08级软件工程1班
姓名宋金骥
学号: 200830912071
班内序号46
一. 程序概述。
1. 你的源程序及可执行程序保存在服务器上的路径(此项不写清楚的必定要参加答辩)
当输入。/的时候源程序的执行结果就显示如上图,这时候已经进入了该程序,输入命令“pwd”系统则显示出源程序保存在服务器上的路径为:/home/08446
显然可知可执行程序也与源程序保存的路径一样。
2. 完成的功能。
本程序在不使用system()系统调用的前提下实现了某些linux环境下的系统自带功能,如:
1、 pwd命令是显示当前所在目录的路径名输入格式:pwd
2、 dir命令是列出指定目录名中的所有目录及文件。 输入格式:dir
3、 cd命令是改变当前工作目录。 输入格式:cd《目录名或路径》
4、 newdir命令是新建所输入的目录。 输入格式:new 《目录名》
5、 deldir命令是删除所输入的目录。 输入格式:deldir《目录名》
6、 exit命令是退出命令解释程序输入格式:exit
二. 概念原理。
该命令解析器程序运用了c++与c语言相结合完成了题目所要求的几种功能,并充分调用了外部函数实现各项功能。如下是程序中运用较为重要的几个函数:
1、 在pwd()函数里用到了getcwd()函数,该函数。
原型为:char *_getcwd( char *buffer, int maxlen );
功能:获取当前工作目录。
参数说明:_getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数maxlen为buffer的空间大小。所以需要显示当前所在目录的路径名只需要运用getcwd()函数就能直接获取出来。
2、 在dir()函数里用到了opendir()函数,该函数。
原型为:dir* opendir (const char * path );
功能:打开一个目录。
该函数的使用方便程序打开当前目录或自己需要打开的目录,如果打开失败返回值为-1。
3、 readdir()函数语法:struct dirent* readdir(dir* dir_handle);
返回值:dirent结构
函数种类:文件存取
内容说明:本函数用来读取目录。返回是dirent结构体指针。
4、 closedir()是关闭目录句柄的函数,void closedir ( resource $dir_handle )关闭由 dir_handle 指定的目录流。流必须之前被 opendir() 所打开。
opendir()、readdir()、closedir()三个函数的作用可以理解为当程序读取dir()函数的时候打开当前的工作目录然后依次读取目录信息最后输出目录信息,三者都缺一不可,否则不能完整的输出该目录的信息。
5、 在cd()函数里用到了chdir()函数,chdir 是c语言中的一个系统调用函数(同cd)
函数名称:_chdir(在tc2.0下可以写作chdir)
功能: 改变当前工作目录。
头文件:在tc2.0下为。
用法: int _chdir(const char *path);
返回值:成功返回0 ,失败返回-1
当成功改变当前目录时则返回0,若目录不存在或改变不成功时返回-1。
6、 在新建目录函数newdir()里有一个重要的创建目录函数mkdir(),该函数的头文件库:#include #include
函数原型:int mkdir(const char *pathname, mode_t mode);
函数说明:mkdir()函数以mode方式创建一个以参数pathname命名的目录,mode定义新创建目录的权限。
返回值:若目录创建成功,则返回0;否则返回-1,并将错误记录到全局变量errno中。
7、 与新建目录函数用法相同但意义相反的是在删除函数deldir()里的rmdir(),该函数名称:_rmdir(tc下为rmdir)
函数原型:int _rmdir( const char *dirname );
函数功能: 删除一个目录,若成功则返回0,否则返回-1。
三. 完成情况。
题目要求实现的基本命令已经实现,由于有些不懂的函数是在网上查询而来的所以该程序写法看上去有点乱,但分布有条理,让人看上去通俗易懂。还有就是该程序的登录界面十分简洁,没有花大量的功夫在主登录界面的排版上,看上去显得很草率。
四. 详细设计。
程序的每个功能都有由一个函数来实现,而函数里面有许多调用外部的函数需要在网上寻找它们的用法。
void pwd()
char a[300];
getcwd(a,300);
cout<}
getcwd() 函数返回当前目录。若成功,则返回当前工作目录,否则返回 false。
在int dir ()函数中:
printf("输入要进入的目录名,输入。为查看当前目录");
scanf("%s",m);
if (strcmp(".m)==0如果命令不带参数。
elsereaddir读取目录信息。
closedir是关闭目录句柄的函数,流必须之前被 opendir() 所打开。
在cd()函数中:
调用了chdir()函数目的是改变当前工作目录。
scanf("%s",ab);
if (chdir(ab)==1) /改变目录并判断是否失败。
else cout<<"改变目录成功"< return 0;
但程序成功改变目录则返回0,改变目录失败则返回-1。
在newdir()与deldir()两个函数中分别运用了mkdir()与rmdir()来实现目录的创建与删除功能,该函数的用法是在网上学习而来的,其中在mkdir(n,0777)中的0777是一个权限设置,默认的mkdir是0777,意味着最大可能的访问权。
void kris()
cout<<"200930111016@]$
该函数是完成题目要求的命令介绍程序提示符为:姓名拼音@。
在main()主函数中:
while(1)
scanf("%s",n);
if(strcmp(n,"exit")=0)
exit(1);
elseif((strcmp(n,"pwd"))0)
pwd();
kris();
if(strcmp(n,"dir")=0)
dir();
kris();
if (strcmp(n,"cd")=0)
cd();kris();
if(strcmp(n,"newdir")=0)
newdir();
kris();
if(strcmp(n,"deldir")=0)
deldir();
kris();
该主函数运用了简单了if 语句来完成最后的系统调用,从而达到了各个命令的功能。
五. 使用情况。
1、当输入。/后则进入该命令解析器,如下图为该解析器的首界面。
按照首界面的提示输入pwd后则显示当前所在目录的路径名。
2、当输入dir后则屏幕显示如下图1,如果要查看当前目录就需要输入”.”回车后如下图2显示出当前目录中的所有目录及文件。
3、输入cd 《目录名或路径》则改变目录成功,键入pwd即可查看到当前目录已经改变。
4、输入newdir 《目录名》为新建一个目录,该目录名称为您所输入的目录名。如图我新建了一个名为jjj的目录,新建成功后键入dir则查询到刚刚新建的目录。
5、输入deldir 《目录名》为删除您所输入的目录。如图我删除名为jin的目录,删除成功后键入dir则找不到刚刚删除的目录。说明删除成功。
操作系统课程设计
课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...
操作系统课程设计
银行家算法模拟。系别 班级 组员 银行家算法模拟。1.课程设计目的。通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件 安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。2.任务及要求。设n为系统进程的个...
操作系统课程设计
学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....