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


相关文章
|
2月前
|
安全 网络安全 网络虚拟化
深入解析IDS/IPS与SSL/TLS和网络安全
防火墙 防火墙是一种网络安全设备,用于监控和控制网络流量,保护网络免受未经授权的访问、恶意攻击和威胁。防火墙可以基于规则进行数据包过滤,允许或阻止特定类型的流量通过。常见的防火墙类型包括网络层防火墙和应用层防火墙。 防火墙就像是你家的安全门,保护你的电脑网络不受坏人的攻击。它像一个警卫一样,只允许那些你信任的人进入你的网络,而把不好的人拒之门外。
195 0
|
2月前
|
Web App开发 缓存 JavaScript
【安装指南】nodejs下载、安装与配置详细教程
这篇博文详细介绍了 Node.js 的下载、安装与配置过程,为初学者提供了清晰的指南。读者通过该教程可以轻松完成 Node.js 的安装,了解相关配置和基本操作。文章首先介绍了 Node.js 的背景和应用场景,随后详细说明了下载安装包、安装步骤以及配置环境变量的方法。作者用简洁明了的语言,配以步骤图示,使得读者能够轻松跟随教程完成操作。总的来说,这篇文章为初学者提供了一个友好的入门指南,使他们能够顺利开始使用 Node.js 进行开发。
523 1
【安装指南】nodejs下载、安装与配置详细教程
|
9月前
|
运维 安全 Cloud Native
阿里云云安全中心介绍_态势感知_主机安全_漏洞扫描
阿里云云安全中心介绍_态势感知_主机安全_漏洞扫描,阿里云云安全中心(原态势感知)是一个实时识别、分析、预警安全威胁的服务器主机安全管理系统,云安全中心功能支持漏洞扫描与修复、基线检查、防勒索、防病毒、防篡改、威胁检测模型等功能,云安全中心基础版免费、防病毒班432元一年、高级版优惠价969元一年,还有企业版和旗舰版可选
261 0
|
自然语言处理 Ubuntu 安全
14个你必须要知道的ubuntu快捷键
14个你必须要知道的ubuntu快捷键
14个你必须要知道的ubuntu快捷键
|
2月前
|
Ubuntu 安全 虚拟化
vmware虚拟机运行ubuntu等卡慢的解决办法
vmware虚拟机运行ubuntu等卡慢的解决办法
591 0
|
Java Go
java 继承关系的内存图解 (通俗易懂)
Java 继承关系中的内存图解,逐步拆分!
571 0
java 继承关系的内存图解 (通俗易懂)
|
11月前
|
JavaScript Windows
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
|
云安全 机器学习/深度学习 人工智能
阿里云防火墙率先获得ICSA Labs Cloud IPS认证
日前,阿里云·云防火墙产品获得国际权威安全检测机构ICSA Labs的云安全IPS认证。在历经长达一年的严格测试后,阿里云成为唯一一家通过测评的提供云原生防火墙的厂商,在大流量、复杂部署架构下的产品稳定性、兼容性及各方面功能获得高度认可。
206 0
|
人工智能 监控 API
打造未来,API网关成为AIGC访问的基石
最近人工智能爆炸性消息层出不穷,先是百度和微软分别宣布将于近期发布新款类ChatGPT产品,随着相关消息披露,商业化成为业内最为关注的话题。此前OpenAI宣布开放ChatGPT的API接口。这意味着,任何公司和个人都可以在自己的程序中自由调取ChatGPT的相关功能。随着ChatGPT的强大功能不断被验证,近期一批A股上市公司纷纷宣布接入或计划接入ChatGPT等类似系统。随着ChatGPT的API接口正式开放,更多公司的加入将会加速相关模型的商业化落地。
740 0