zoukankan      html  css  js  c++  java
  • 操作系统 实验一 命令解释程序的编写

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

    一、目的和要求

    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!
    ");
    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!
    ");
    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
    ",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]
    ");
    50     printf("(C) 版权所有 1985-2001 Microsoft Corp.
    ");
    51     while(strcmp(str,"quit")!=0){    //比较str输入内容,若相同则返回0值,即若为quit则比较结果为0,退出循环
    52         printf("
    C:\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("键入命令名可查询详细的命令信息
    ");
    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' 是内部命令
    该命令作用介绍:%s
    ",str,cm[i].function);
    68                         if(strcmp(str,"time")==0){
    69                             printf("星期·月份·当前时间·年份
    ");
    70                             printf("%s",s);}
    71                         if(strcmp(str,"dir")==0){
    72                             printf("2016/03/12  11:29   <DIR>     .
    2016/03/12  11:29   <DIR>     ..
    2014/11/19  16:35   <DIR>     .android
    2016/03/09  21:30          247.bash_history
    2016/03/12  10:46   <DIR>   94.deliverycenter.installs
    2016/03/12  11:29   <DIR>     .eclipse
    2016/03/09  19:09           54.gitconfig
    2015/12/13  18:40          176.packettracer
    2015/03/07  13:03   <DIR>     .virtualBox
    2014/08/15  09:19   <DIR>     AppData
    2016/03/13  00:14   <DIR>     Contacts
    2016/03/19  10:43   <DIR>     Links
                   6 个文件           1,364 字节
                  22 个目录  34,341,150,720 可用字节
    ");}
    73                         if(strcmp(str,"cd")==0){
    74                         printf("C:\Documents and Settings\hskd>");}
    75                     }
    76                     else{
    77                         printf("'%s' 是外部命令!
    该命令作用介绍:%s
    ",str,cm[i].function);
    78                         if(strcmp(str,"java")==0){
    79                             printf("用法:Java [-options] class [args…]
    <执行类>
    或   Java [-options] -jar jarfile [args…]
    <执行 jar 文件>
    其中选项包括:
        -d32      使用32位数据模型(如果可用)
        -d64      使用64位数据模型(如果可用)
        -client   选择'client' VM
        -server   选择'server'VM
                      默认VM是client.
     
        -cp<目录和 zip/jar 文件的类搜索路径>
                用;分隔的目录,jar档案
                和 ZIP 档案列表,用于搜索类文件
    ");}
    80                     }
    81                     flag=true;
    82                     break;
    83                 }
    84             }
    85             if(!flag){
    86                 if(strcmp(str,"quit")!=0)
    87                     printf("'%s' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    ",str);
    88             }
    89         }
    90     }
    91     printf("
    程序结束!
    
    ");
    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语言这最为接近原始编程的语言执行过程中,也是深深地去体会了一次操作系统内部的指令执行流程。

  • 相关阅读:
    第十五篇 -- 学习第十四天打卡20190702
    第三篇 -- 方向
    第十四篇 -- 学习第十三天打卡20190701
    yum更换阿里源
    Jenkins+sonar7.3集成
    xshell 5 书写汉字乱码
    zabbix 短信报警
    zabbix 微信报警
    zabbix邮件报警
    zabbix主动监测客户端设置
  • 原文地址:https://www.cnblogs.com/skywalkersg/p/5310628.html
Copyright © 2011-2022 走看看