操作系统 实验一 命令解释程序的编写
实验一 命令解释程序的编写
一、目的和要求
1. 实验目的
(1)掌握命令解释程序的原理;
(2)掌握简单的DOS调用方法;
(3)掌握C语言编程初步。
2.实验要求
编写类似于DOS,UNIX的命令行解释程序
(1)自行定义系统提示符
(2)自定义命令集(8-10个)
(3)用户输入HELP以查找命令的帮助
(4)列出命令的功能,区分内部还是外部命令
(5)用户输入QUIT退出
(6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。
二、实验内容
根据教师指定的实验课题,完成设计、编码、测试工作。
三、实验环境
1.PC微机
2.Windows 操作系统
3.C/C++程序开发集成环境
四、实验原理及核心算法
1.原理及分析
命令解释程序的主要功能是:接受和执行一条用户从键盘输入的命令,它通常保存一张命令名字(动词)表,其中记录着所有操作命令及其处理程序的入口地址或有关信息。
命令解释程序实现的两种方式 :
1) 一种是它自身包含了命令的执行代码;
2) 另一种是由专门的“系统程序” 实现,自身不含命令处理代码,也不进行处理,仅仅把这条命令对应的命令文件装入内存执行。
编程实现的流程简述:
显示程序提示信息;
While(1)
{ 显示提示符;
接收键盘的字符串;
判断是否quit程序退出指令,是则退出;
判断是否内部命令,并给出相应的信息,否则给出错误信息;
}
显示退出程序信息;
本次实验主要运用了结构体来收录数据:
struct Cmd{
char cmd[30]; //命令名称
char function[500]; //命令功能解释
int post; //标志内、外部命令
char parameters[800]; //参数命令
};
然后本次实验中相对较为重要的便是strcmp()函数,主要是通过此函数来实现对命令的识别
本次实验的原代码如下:
经由老师提供的代码参考进行修正及功能添加后,实现了课程要求功能,且能对部分内部指令进行相应的操作
1 #include<stdio.h> 2 #include<string.h>//在使用到字符数组时需要使用 3 #include<stdlib.h> 4 #include <time.h> //调用系统时间 5 #define Max 500 6 struct Cmd{ 7 char cmd[30]; //命令字符 8 char function[500]; //命令解释 9 int post; //命令分类 1-内部命令 0-外部命令 10 }; 11 int count=0; 12 13 void Init(struct Cmd cm[Max]) //从cmd文档中读取 14 { 15 FILE *fp; 16 if((fp=fopen("cmd.txt","a+"))==NULL) 17 { 18 printf("File open error!\n"); 19 exit(0); 20 } 21 while(!feof(fp)&&fgetc(fp)!=EOF) 22 { 23 fseek(fp,-1L,SEEK_CUR); 24 fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post); 25 count++; 26 } 27 if(fclose(fp)) 28 { 29 printf("Can not close the file!\n"); 30 exit(0); 31 } 32 } 33 void display(struct Cmd cm[Max]) 34 { 35 for(int i=0;i<count;i++) 36 { 37 printf("%-10s%s\n",strupr(cm[i].cmd),cm[i].function); 38 strlwr(cm[i].cmd); 39 } 40 } 41 void process(struct Cmd cm[Max]) 42 { 43 char str[10]; 44 time_t timep; 45 char s[30]; 46 time(&timep); 47 strcpy(s,ctime(&timep)); 48 49 printf("Microsoft Windows XP [版本 5.1.2600]\n"); 50 printf("(C) 版权所有 1985-2001 Microsoft Corp.\n"); 51 while(strcmp(str,"quit")!=0){ //比较str输入内容,若相同则返回0值,即若为quit则比较结果为0,退出循环 52 printf("\nC:\\Documents and Settings\\hskd>"); 53 scanf("%s",str); 54 strlwr(str); //转换大小写 55 bool flag=false; 56 if(strcmp(str,"help")==0) 57 { 58 display(cm); //调用程序打印出所有命令及提示内容 59 printf("键入命令名可查询详细的命令信息\n"); 60 flag=true; 61 }else{ 62 for(int i=0;i<count;i++) 63 { 64 if(strcmp(str,cm[i].cmd)==0) 65 { 66 if(cm[i].post==1){ 67 printf("'%s' 是内部命令\n该命令作用介绍:%s\n",str,cm[i].function); 68 if(strcmp(str,"time")==0){ 69 printf("星期·月份·当前时间·年份\n"); 70 printf("%s",s);} 71 if(strcmp(str,"dir")==0){ 72 printf("2016/03/12 11:29 <DIR> .\n2016/03/12 11:29 <DIR> ..\n2014/11/19 16:35 <DIR> .android\n2016/03/09 21:30 247.bash_history\n2016/03/12 10:46 <DIR> 94.deliverycenter.installs\n2016/03/12 11:29 <DIR> .eclipse\n2016/03/09 19:09 54.gitconfig\n2015/12/13 18:40 176.packettracer\n2015/03/07 13:03 <DIR> .virtualBox\n2014/08/15 09:19 <DIR> AppData\n2016/03/13 00:14 <DIR> Contacts\n2016/03/19 10:43 <DIR> Links\n 6 个文件 1,364 字节\n 22 个目录 34,341,150,720 可用字节\n");} 73 if(strcmp(str,"cd")==0){ 74 printf("C:\\Documents and Settings\\hskd>");} 75 } 76 else{ 77 printf("'%s' 是外部命令!\n该命令作用介绍:%s\n",str,cm[i].function); 78 if(strcmp(str,"java")==0){ 79 printf("用法:Java [-options] class [args…]\n<执行类>\n或 Java [-options] -jar jarfile [args…]\n<执行 jar 文件>\n其中选项包括:\n -d32 使用32位数据模型(如果可用)\n -d64 使用64位数据模型(如果可用)\n -client 选择'client' VM\n -server 选择'server'VM\n 默认VM是client.\n \n -cp<目录和 zip/jar 文件的类搜索路径>\n 用;分隔的目录,jar档案\n 和 ZIP 档案列表,用于搜索类文件\n");} 80 } 81 flag=true; 82 break; 83 } 84 } 85 if(!flag){ 86 if(strcmp(str,"quit")!=0) 87 printf("'%s' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。\n",str); 88 } 89 } 90 } 91 printf("\n程序结束!\n\n"); 92 } 93 int main() 94 { 95 struct Cmd cm[Max]; 96 Init(cm); 97 process(cm); 98 return 0; 99 }
具体实现功能如下:
1.最基础的help显示所有可执行指令功能
2.可以键入相应的内部指令并对内部指令进行相应的判断,部分指令可直接执行
3.在执行外部命令时有相应操作
4.在遇到不合规范的命令时给出提示
实验结果与预期相符
四、实验总结
通过本次实验,详细的了解了操作系统中的指令执行流程,虽然是通过老师提供的源程序进行的改良,但通过此次编程,在熟悉了计算机指令流程的同时还兼有复习了c语言的编写,在体会c语言这最为接近原始编程的语言执行过程中,也是深深地去体会了一次操作系统内部的指令执行流程。