实现简易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


相关文章
|
7月前
|
运维 安全 Cloud Native
阿里云云安全中心介绍_态势感知_主机安全_漏洞扫描
阿里云云安全中心介绍_态势感知_主机安全_漏洞扫描,阿里云云安全中心(原态势感知)是一个实时识别、分析、预警安全威胁的服务器主机安全管理系统,云安全中心功能支持漏洞扫描与修复、基线检查、防勒索、防病毒、防篡改、威胁检测模型等功能,云安全中心基础版免费、防病毒班432元一年、高级版优惠价969元一年,还有企业版和旗舰版可选
223 0
|
人工智能 监控 API
打造未来,API网关成为AIGC访问的基石
最近人工智能爆炸性消息层出不穷,先是百度和微软分别宣布将于近期发布新款类ChatGPT产品,随着相关消息披露,商业化成为业内最为关注的话题。此前OpenAI宣布开放ChatGPT的API接口。这意味着,任何公司和个人都可以在自己的程序中自由调取ChatGPT的相关功能。随着ChatGPT的强大功能不断被验证,近期一批A股上市公司纷纷宣布接入或计划接入ChatGPT等类似系统。随着ChatGPT的API接口正式开放,更多公司的加入将会加速相关模型的商业化落地。
719 0
|
Prometheus Kubernetes 监控
NVIDIA GPU Operator分析六:NVIDIA GPU Operator原理分析
背景我们知道,如果在Kubernetes中支持GPU设备调度,需要做如下的工作:节点上安装nvidia驱动节点上安装nvidia-docker集群部署gpu device plugin,用于为调度到该节点的pod分配GPU设备。除此之外,如果你需要监控集群GPU资源使用情况,你可能还需要安装DCCM exporter结合Prometheus输出GPU资源监控信息。要安装和管理这么多的组件,对于运维
2262 0
|
弹性计算 CDN
阿里云服务器香港节点和北京深圳上海杭州地域的区别对比
阿里云中国香港地域服务器和中国大陆地域有什么区别?阿里云百科分别从备案、网络延迟速度及价格三方面来详细对比
1100 0
阿里云服务器香港节点和北京深圳上海杭州地域的区别对比
|
存储 Kubernetes Cloud Native
【云原生 | 从零开始学Kubernetes】二十六、配置管理中心configmap
Configmap 是 k8s 中的资源对象,用于保存非机密性的配置的,数据可以用 key/value 键值对的形式保存,也可通过文件的形式保存。
336 0
【云原生 | 从零开始学Kubernetes】二十六、配置管理中心configmap
|
开发框架 负载均衡 Java
服务器之Apache和Tomcat和Nginx的理解和对比
服务器之Apache和Tomcat和Nginx的理解和对比
386 0
|
监控 安全 网络协议
图解网络:什么是DHCP动态主机配置协议?
DHCP是网络技术世界一项特别伟大的技术,解决了静态配置IP繁琐的过程,其动态分配IP地址的特性,使得网络变得灵活可扩展。 如果没有 DHCP,很难想象我们将如何连接到互联网或本地网络,DHCP 是我们在 IP 网络上的设备如何相互通信以及与我们周围的世界通信的重要组成部分。
337 0
图解网络:什么是DHCP动态主机配置协议?
|
云安全 弹性计算 小程序
阿里云服务器部署开发环境(搭建博客网站/小程序)
大家好,今天为大家讲解如何搭建自己的阿里云服务环境,也是笔者踩坑一天所获,希望对大家有所帮助。
2701 0
阿里云服务器部署开发环境(搭建博客网站/小程序)
|
SQL 监控 Kubernetes
ingress 日志,还能这么玩--结合阿里云日志服务统计系统访问日志
修改 nginx-ingress 日志,并结合阿里云日志服务制作系统访问日志统计图表。
1905 0