简易shell的编写

在正式编写简易shell之前,让我们先了解一下关于shell的知识

一、背景知识

1、什么是shell

(1)在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。
(2)同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

2、shell的工作模式

在实现一个shell需要循环以下过程:
(1)获取命令行
(2)解析命令行
(3)建立一个子进程(fork())
(4)替换子进程(execvp)
(5)父进程等待子进程退出(wait)

3、图形描述

⽤用下图的时间轴来表⽰示事件的发⽣生次序。其中时间从左向右。shell由标识为sh的⽅方块代表,它随着时间的流逝从左向右移动。shell从⽤用户读⼊入字符串”ls”。shell建⽴立⼀一个新的进程,然后在那个进程中运⾏行ls程序并等待那个进程结束。
简易shell的编写_第1张图片
我们来看一下一个与shell典型的互动
简易shell的编写_第2张图片

二、编写简易shell

根据shell的工作模式以及利用进程方面相关的知识,我们可以实现一个简单的shell了
实验代码:

  1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 
  7 char *argv[8];
  8 int argc=0;
  9 //解析和获取命令行
    //解析字符串
 10 void do_parse(char *buf)
 11 {
 12     int i;
 13     int status=0;
 14     for(argc=i=0;buf[i];i++)
 15     {
 16         if(!isspace(buf[i])&&status==0)//从字符到空格
 17         {
 18             argv[argc++]=buf+i;
 19             status=1;
 20         }
 21         else if(isspace(buf[i]))//从空格到字符
 22         {
 23             status=0;
 24             buf[i]=0;
 25         }
 26     }
 27     argv[argc]=NULL;
 28 }
 29 建立和回收子进程
 30 void do_execute(void)
 31 {
 32     pid_t pid=fork();//创建子进程
 33     switch(pid)
 34     {
 35         case -1:
 36             perror("fork");
 37             exit(EXIT_FAILURE);
 38             break;
 39         case 0:
 40             execvp(argv[0],argv);//替换子进程
 41             perror("execvp");
 42             exit(EXIT_FAILURE);
 43             break;
 44         default:
 45             {
 46                 int st;
 47                 while(wait(&st)!=pid)//回收子进程
 48                     ;
 49             }
 50     }
 51 }
 52 
 53 int main()
 54 {
 55     char buf[1024]={};
 56     while(1)
 57     {
 58         printf("myshell:>");
 59         scanf("%[^\n]%*c",buf);
 60         do_parse(buf);
 61         do_execute();
 62     }
 63 }

运行结果:
简易shell的编写_第3张图片

三、总结

(1)文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
(2)shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。

上面实现的shell功能比较单一,感兴趣的可以对其进行载丰富!

你可能感兴趣的:(Linux)