MI SHELL--简易版的迷你shell

迷你shell实现

shell:命令行解释器,就是对我们输入的命令进行解释,实现命令功能

思路

  • 1、等待标准输入
  • 2、解析输入数据
  • 3、判断是否内建命令
  • 4、创建子进程进行程序替换
  • 5、回收子进程

具体代码实现

1 //shell
  2 //1、等待用户输入
  3 //2、解析输入数据  【ls】【-l】
  4 //3、创建子进程
  5 //4、等待子进程退出(重复)
  6 #include<stdio.h>
  7 #include<stdlib.h>
  8 #include<unistd.h>
  9 int main()
 10 {
 11     while(1){
 12         //打印界面
 13         printf("[zhangxu@localhost]$  ");
 14         fflush(stdout);// 刷新缓冲区,直接打印界面
 15         //等待标准输入
 16         char buf[1024];
 17         if(scanf("%[^\n]%*c",buf) != 1){
 18             getchar();
 19             continue;
 20         }
 21 
 22         //解析用户输入
 23         char* argv[32];
 24         int argc = 0;
 25         char* ptr = buf;
 26 
 27         while(*ptr != '\0') {
 28             if (!isspace(*ptr)) {
 29                 //当前位置是非空白字符
 30                 argv[argc++] = ptr;
 31                 while(!isspace(*ptr)	&& *ptr != '\0') {
 32                     ptr++;
 33                  }
 34             }
 35             *ptr = '\0';
 36             ptr++;
 37         }
 38         //创建子进程
 39 
 40         argv[argc] = NULL;
 41         //判断命令是否是内建命令
 42         if(strcmp(argv[0], "cd") == 0) {
 43             //int chdir(const char *path);
 44             //改变当前工作路径
 45             chdir(argv[1]);
 46             continue;
 47         }
 48         //创建子进程---执行任务
 49         int pid = fork();
 50         if (pid < 0) {
 51             continue;  //创建失败,继续创建
 52         }else if(pid==0){
 53             if(execvp(argv[0],argv)<0){
 54                 perror("");
 55             }
 56             exit(0);  //程序替换失败,退出
 57         }
 58         else{
 59             //父进程等待,避免僵尸进程
 60             wait(NULL);
 61         }
 62     }
 63     return  0;
 64 }


总结

  • 实现这个迷你shell其实并不是特别难,只要你能将思路捋清楚,一步步实施就没有很大的问题,但再这里我还是要再说明一下,本次代码实现中引入了缓冲区的概念还是值得我们去关注下的,刚开始我也是有很多疑惑,了解了缓冲区后,才豁然开朗,关于缓冲区的问题我将会再进行文件操作时与大家分享。大家也不妨可以实现一下这个迷你shell,还是挺有意思的,对于我们新手来说还是有很大帮助的。

猜你喜欢

转载自blog.csdn.net/qq_43503315/article/details/89054752
mi