自主实现一个简单的shell

最近学习linux,打开linux虚拟机在一个“黑框框”中敲下一些命令,就能对应的执行一些操作,通过对shell的进一步学习,对它的底层实现产生了浓厚的兴趣,应该通过学习,下面实现一个简单的迷你版的myshell。

一、myshell的执行过程。

1.获取命令行。

2.解析命令行。

3.建立一个子进程。

4.替换子进程。

5.父进程等待子进程退出。

二、根据前面的思路和学过的知识,下面是实现的代码。

#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>
void Parse(char buf[],char* argv[])
{
     size_t argc = 0;
     char* ptr = strtok(buf," ");
     argv[argc++] = ptr;
     while(ptr!= NULL)
     {
     ptr = strtok(NULL," ");
     argv[argc++] = ptr;
     }
     argv[argc] = NULL;
     return;
}
void Exec(char* argv[])
     {
     pid_t ret = fork();
     if(ret > 0){
     wait(NULL);
     }else if(ret == 0)
     {
     execvp(argv[0],argv);
     perror("execvp");
     }else{
     perror("fork");
     }
     return;
     }
void Run(){
     //1.从标准输入中读入一个字符串
     while(1){
     printf("[myshell]$");
         char buf[1024] = {0};
              gets(buf);
     //2.解析字符串
     char* argv[100] = { NULL };
     Parse(buf,argv);
     //3.创建一个子进程来执行命令
     Exec(argv);
     }
}
void     TestParse()
{
     char str[] = "  ls   -a   ./  ";
     char* argv [100]= {NULL};
     Parse(str ,argv);
     size_t i = 0;
     for(;argv[i] != NULL; ++i){
     printf("argv[%lu]",i);
     }
}
int main()
{
     Run();
     //TestParse();
     return 0;
}

三、运行截图。

这里写图片描述

四、总结。

实现的myshell只是一个简单的迷你版的shell,只包含一些简单的功能,还有很多不足和缺点,希望在以后更深入的学习中,进一步完善它的功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值