实现简易minishell

简介: 实现简易minishell

1.shell简介


shell是命令行解释器,功能就是捕捉用户的输入,然后根据输入的信息运行指定的命令程序。


2.逻辑实现过程


(1)捕捉用户输入


(2)字符串解析,得到命令名称和运行参数


(3)创建子进程,并对子进程进行程序替换,设置运行参数


(4)进程等待,防止子进程成为僵尸进程


(5)循环上述操作


3.实现思路


(1)捕捉用户输入


通过fgets函数读取用户输入保存到input字符数组中。


注意:用户输入可能夹带空格,不能使用scanf函数进行输入捕捉。


(2)字符串解析,得到命令名称和运行参数


通过指针数组argv保存每一个操作或选项的字符首地址,并将每个操作或选项的末尾的下一个字符替换为'\0'。


注意:argv末尾位置需要替换为NULL,以空作为参数结尾


(3)创建子进程,并对子进程进行程序替换,设置运行参数


通过pid对父子进程进行分流,利用execvp函数对子进程进行程序替换,让子进程运行对应的指令程序。


注意:不能直接对minishell进行替换,因为替换后运行完新程序,进程就会退出;并且如果替换了minishell,在运行某个指令程序时崩溃,minishell也就崩溃了。因此需要创建子进程,通过子进程来运行指令程序。


(4)进程等待,防止子进程成为僵尸进程


通过wait方法,让父进程等待子进程运行完毕退出,防止子进程成为僵尸进程。


(5)循环上述操作


利用while循环进行上述操作。


4.代码实现


#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>
int main(){
  extern char** environ;//声明环境变量
  while(1){
    //1.捕捉用户输入
    printf("[username&hostname]$ ");
    fflush(stdout);//刷新缓冲区
    char input[1024]={0};
    fgets(input,1023,stdin);//从标准输入读取一行数据,数据不能大于1023字节
    input[strlen(input)-1]='\0';//将最后一个字符换为\0
    //2.字符串解析
    char* ptr=input;
    char* argv[32]={NULL};
    int argc=0;
    while(*ptr!='\0'){
      if(*ptr==' '){//查找第一个指令字符
        ptr++;
        continue;
      }
      argv[argc]=ptr;//保存指令地址
      argc++;
      while(*ptr!='\0'&&*ptr!=' '){//将末尾的下一个位置替换为'\o'
        ptr++;
      }
      *ptr='\0';
      ptr++;
    }
    argv[argc]=NULL;//以空作为参数结尾
    //3.创建子进程,进行程序替换
    pid_t pid=fork();
    if(pid==0){//子进程
      execvp(argv[0],argv);
      exit(-1);//替换失败则退出子进程,否则子进程会成为第二个minishel
    }
    wait(NULL);//等待子进程退出
  }
  return 0;
}


5.测试用例及结果


测试用例1:“  ls -a"


测试结果:


1.png


测试用例2:”ls -l  “


测试结果:


2.png


测试用例3:”pwd"


测试结果:


 3.png


相关文章
|
Ubuntu
Ubuntu系统镜像下载,国内镜像站大全(山大/清华/阿里/浙大/中科大...)
装Ubuntu,是很多理工科同学入门的第一个挑战,首先我们就需要找到一个能用的iso镜像,根据你的网络环境的不同,不同的站点下载速度会不一样,下面列举一下几个比较好用的,都是来自Ubuntu官方推荐镜像站链接导航国内分区
44495 1
|
安全 Unix Linux
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
163898 65
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
338 0
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
测试技术
自动化测试|录制回放效果差异检测
闲鱼技术-深宇 概述   回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他的代码出现错误。传统的自动化回归测试需要手动编写脚本获得页面元素的视图树,与原有的元素视图树进行比对。
9422 0
|
7天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1304 6
|
5天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
|
10天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
1月前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9956 33
|
5天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
506 0