模拟实现Shell

模拟实现shell

实现shell,需要做到以下四点:

  • 接收带空格的字符串
  • 解析字符串,实现做到遇到空格则发生截断,再将其放入子进程的参数列表
  • 创建一个子进程进行进程替换,实现用户的功能
  • 父进程等待子进程结束,退出程序
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <string.h>
  5 #include <sys/types.h>
  6 #include <sys/wait.h>
  7 
  8 char *argv[50];
  9 int argc = 0;
 10 int falg;
 11 
 12 extern void do_exec(void);
 13 
 14 void do_analysis(char* str, int size)
 15 {
 16     if(str == NULL)
 17         return ;
 18     int i = 0;
 19     char *ptr = str;
 20     while(str[size - 1] == ' '){
 21             str[size - 1] = '\0';
 22             size--;
 23     }
 24 
 25     while(i < size - 1){
 26         if((str[i] == ' ') && (i != 0) && (str[i+1] != ' '))
 27         {
 28             str[i] = '\0';
 29             i += 1;
 30             argv[argc++] = ptr;
 31             ptr = str + i;
 32         }
 33         else
 34             ++i;
 35     }
 36 
 37     argv[argc++] = ptr;
 38     argv[argc] = NULL;
 39 
 40     do_exec();
 41 }
 42 
 43 void do_exec(void)
 44 {
 45     pid_t pid = fork();
 46 
 47     if(pid < 0)
 48         perror("fork"),
 49             exit(1);
 50     else if(pid == 0)
 51     {
 52         falg = 1;
 53         execvp(argv[0], argv);
 54     }
 55 
 56     wait(NULL);
 57 
 58     return ;
 59 }
 60 
 61 int main(void)
 62 {
 63     int falg = 0;
 64     while(1){
 65 
 66         int len = 0;
 67         char buff[1024] = {0};
 68         printf("myshell>");
 69         scanf("%[^\n]%*c", buff);
 70         do_analysis(buff, strlen(buff));
 71         argc = 0;
 72     }
 73 
 74     return 0;
 75 }

这只是一个基本的shell框架,其中还有许多bug没有处理完,但是可以实现一些基本命令操作,若可以将代码补充或者探讨bug可以发表评论在下方。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值