操作系统 实验一 命令解释程序的编写

实验一  命令解释程序的编写

一、目的和要求

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语言这最为接近原始编程的语言执行过程中,也是深深地去体会了一次操作系统内部的指令执行流程。

posted @ 2016-03-23 12:53  44官郅豪  阅读(1712)  评论(0编辑  收藏  举报