视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
c语言模拟shell命令行解释程序
2025-10-02 15:10:11 责编:小OO
文档
    北京联合大学

         《操作系统课程设计》

                 

           实验一:命令行解释程序

学  院:    信息学院    专  业:  计算机科学与技术  

课  程:    操作系统    班  级:   1 1 0 3 B        

姓  名:    傅 笔 贵    学  号:   2009080305302    

2014年 7 月 10 日

一.采用的数据结构说明

字符数组:

本程序中包含的字符数组有:

filename1[20]:在Ccopy()函数中,存储源文件路径和名字的字符数组。

filename2[20]:在Ccopy()函数中,存储目标文件路径和名字的字符数组。

oldname[20]:在Cmv()函数中用来保存源文件路径和名字的字符数组。

newname[20]:在Cmv()函数中用来保存目标文件路径和名字的字符数组。

Cho2[6]:存取用户输入的指令,并用来作为Switch分支的判定条件之一。

File[20]:Cerase()函数中用来存放要删除的文件的路径和名字的字符数组。

Word[100]:在Cdis()中存放用户要回显的字符串。

二.源程序清单、注释和流程图

(1)流程图

(2)源程序和注释

#include

#include

#include

#include

#include

#include

#include

int flag=1;

char ch[8];//存储文件读取内容的中间变量                    

FILE *fp;

FILE *fp1;

char filename1[20];/*复制文件候存放的原文件名*/

char filename2[20];/*复制文件候存放的目标文件名*/           

char oldname[20];/*用来存放移动文件的源文件名*/

char newname[20];/*用来存放移动文件的目标文件名*/

void start_copy(char *filename1,char *filename2)

/*文件复制函数,可以实现文本和图片的复制*/

{           

    if((fp=fopen(filename1,"rb"))==NULL||(fp1=fopen(filename2,"wb"))==NULL)

    /*源文件或目标文件打开失败则无法进行复制*/

    {

        printf("can't open the source file!\\n");

        exit(0);

    }

    else

    {    

        fread(ch,1,8,fp);//一次读取八个字节的字节流,存放到ch字符数组里

        while (!feof(fp))//没读取到文件尾部时,持续读取                        

        {

            fwrite(ch,1,8,fp1);//写到目标文件里

            fread(ch,1,8,fp);//继续读取

        }

        fclose(fp);//关闭指针,释放内存

        fclose(fp1);

    }

}

void Cend()

{

  flag=0;//将循环条件flag=1变为0来结束循环,结束程序

}

void Cdir()

{    

    /*目录显示函数,除了调用Cmd没有更好的

      解决办法,是本程序的遗憾.*/

    system("cmd.exe /b dir");

}

void Ccopy()//文件复制主函数

{

    scanf("%s%s",&filename1,&filename2);//获取源文件和目标文件名

    start_copy(filename1,filename2);//传参到复制函数

}

void Cerase()//删除文件函数

{

    char File[20];//文件名存储

    scanf("%s",&File);//获得文件名

    if(remove(File)==0)//删除成功remove返回0

    {

        printf("Remove %s Successfully!\\n",File);

    }

    else

    {

        perror("Failed!");

    }

}

void Cdis()

{    

    char Word[100];//存放用户输入的字符串

    getchar();//吸取第一个不必要的空格字符

    gets(Word);//获得用户的字符串内容

    printf("---------E---C---H---O-------------\\n");

    puts(Word);//显示用户的字符串内容

}    

void Cmv()//移动或重命名文件函数

{

    scanf("%s%s",&oldname,&newname);//用来获取用户输入的两个文件名

    rename(oldname,newname);

}

int main()

{

 //定义判定字符

 char cdir1[]="Cdir";

 char cdir2[]="cdir";

 char ccopy1[]="Ccopy";

 char ccopy2[]="ccopy";

 char cerase1[]="Cerase";

 char cerase2[]="cerase";

 char cdis1[]="Cdis";

 char cdis2[]="cdis";

 char cend1[]="Cend";

 char cend2[]="cend";

 char clr1[]="Cclr";

 char clr2[]="cclr";

 char cmv1[]="Cmv";

 char cmv2[]="cmv";

 char cuname1[]="Cuname";

 char cuname2[]="cuname";

 while(flag)

 {

  char Cho[100]={0};

  char Cho2[6];

  int num=0;

  /*主菜单*/

  printf("-----------------------------------\\n");

  printf("---------M    E    N    U----------\\n");

  printf("-----------------------------------\\n");

  printf("Cdir    .   Show the Detail of Dir and files.\\n");

  printf("Ccopy   .   Copy the file.\\n");

  printf("Cerase  .   Erase(Delete) the file.\\n");

  printf("Cdis    .   The Echo of your input words\\n");

  printf("Cclr    .   Clear the Screen.\\n");

  printf("Cmv     .   Move Or Rename the file.\\n");

  printf("Cuname  .   Show CPU Info.\\n");

  printf("Cend    .   Quit.\\n");

  printf("\\n");

  printf("\\n");

  printf("Please Enter The Command:");

  scanf("%s",&Cho2);

  /*下面这一段将对用户输入的字符串第一个空格前的

    内容进行判定,确定功能号,在转入对应的Case分支

    决定用户本次所使用的功能.*/

  if(strcmp(Cho2,cdir1)==0||strcmp(Cho2,cdir2)==0)//首字母大小写均可识别

  {

      num=1;

  }

  else if(strcmp(Cho2,ccopy1)==0||strcmp(Cho2,ccopy2)==0)

  {

      num=2;

  }

  else if(strcmp(Cho2,cerase1)==0||strcmp(Cho2,cerase2)==0)

  {

      num=3;

  }

  else if(strcmp(Cho2,cdis1)==0||strcmp(Cho2,cdis2)==0)

  {

      num=4;

  }

  else if(strcmp(Cho2,cend1)==0||strcmp(Cho2,cend2)==0)

  {

      num=5;

  }

  else if(strcmp(Cho2,clr1)==0||strcmp(Cho2,clr2)==0)

  {

      num=6;

  }

  else if(strcmp(Cho2,cmv1)==0||strcmp(Cho2,cmv2)==0)

  {

      num=7;

  }

  else if(strcmp(Cho2,cuname1)==0||strcmp(Cho2,cuname2)==0)

  {

      num=8;

  }

  else

  {

   printf("ERROR COMMAND,TRY AGAIN!\\n");

  }

  switch(num)

    {

    case(1):Cdir();break;//功能1,启动Cmd调用dir \\b检查目录

    case(2):Ccopy();getchar();break;//功能2,复制一个文件到另一个目录

    case(3):Cerase();break;//功能3,删除一个指定路径的文件

    case(4):Cdis();break;//功能4,回显用户输入的字符串内容

    case(5):Cend();break;//功能5,结束程序

    case(6):system("cls");break;//功能6,清屏

    case(7):Cmv();break;//功能7,移动一个文件,如果路径不变只改变名字,则变为重命名功能

    case(8):system("systemInfo");break;//功能8,显示计算机详细信息

    }

  }  

}

三.Windows命令与Linux命令的不同

    本程序的功能有8个,其中Cdir和Linux下的ls基本区别不大,但是ls后面有很多参数,这是和Windows在cmd下调用dir不太一样的地方。

    Ccopy和Linux下的Cp命令没有什么区别。

    Cerase和Linux的rm是有区别的,Linux删除的文件是无法补救的,因此在删除之前会有提示是否要真的删除,rm –r可以连同文件的子目录都删除,这点和windows下的rmdir类似。

    Cdis是我自定的回显函数,和Linux的Echo一样。

    Cend就是单纯的退出程序,和Linux的Logout一样。

    Cclr是清屏功能,就是Linux下的clear指令。

    Cmv是移动文件指令,如果路径不做变化,那么就会变成重命名的功能,和Linux的mv功能一样,移动的时候子目录也会一起移动。

四.收获体会

    C语言一直都是十分经典的编程语言,本次操作系统实训让我重新巩固了下曾经学过的C语言知识,虽然只是实现简单的Shell模拟,而且仅仅是少数功能的模拟,也耗费了我很多的时间,而且为了能更好的符合要求,我还和同学们一起讨论得到了最好的结果,在训练了编程语言的同时,也增加了和同学之间的交流能力,还更好的理解了Shell指令的工作原理,是个一举三得的实训课程!

    未来还有一周的实训课程,而且内容会更加困难,我想这会是一次非常好的机会来加深对操作系统这门课的理解,继续努力!下载本文

显示全文
专题