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


相关文章
|
6月前
|
开发工具 git 应用服务中间件
超简单!基于计算巢SaaS Boost快速售卖你的软件
通过计算巢开源项目SaaS Boost售卖你的软件使用流程
超简单!基于计算巢SaaS Boost快速售卖你的软件
|
6月前
|
安全 网络安全 网络虚拟化
深入解析IDS/IPS与SSL/TLS和网络安全
防火墙 防火墙是一种网络安全设备,用于监控和控制网络流量,保护网络免受未经授权的访问、恶意攻击和威胁。防火墙可以基于规则进行数据包过滤,允许或阻止特定类型的流量通过。常见的防火墙类型包括网络层防火墙和应用层防火墙。 防火墙就像是你家的安全门,保护你的电脑网络不受坏人的攻击。它像一个警卫一样,只允许那些你信任的人进入你的网络,而把不好的人拒之门外。
324 0
|
运维 安全 Cloud Native
阿里云云安全中心介绍_态势感知_主机安全_漏洞扫描
阿里云云安全中心介绍_态势感知_主机安全_漏洞扫描,阿里云云安全中心(原态势感知)是一个实时识别、分析、预警安全威胁的服务器主机安全管理系统,云安全中心功能支持漏洞扫描与修复、基线检查、防勒索、防病毒、防篡改、威胁检测模型等功能,云安全中心基础版免费、防病毒班432元一年、高级版优惠价969元一年,还有企业版和旗舰版可选
402 0
|
6月前
|
存储 Linux
linux waitpid函数详解
linux waitpid函数详解
315 0
|
6月前
|
弹性计算 数据安全/隐私保护 对象存储
【新】如何使用计算巢SaaS Boost完成服务定价和售卖?
本文介绍了一种可帮您实现软件快速上云的阿里云计算巢开源工具,并给出了开发者指引和常见问题。基于该计算巢服务可快速帮助您的软件实现上云和售卖。
|
Java Go
java 继承关系的内存图解 (通俗易懂)
Java 继承关系中的内存图解,逐步拆分!
807 0
java 继承关系的内存图解 (通俗易懂)
|
11月前
|
存储 机器学习/深度学习 监控
网络安全之认识托管威胁检测与响应(MDR)
随着数字化转型加速,企业的IT环境日益复杂,面临的网络安全威胁也在不断增加。传统的防御措施已经无法有效应对新型威胁,而且很多企业缺乏专业的网络安全团队和技术手段,导致大量的安全事件未能及时被发现和处理。 在这种背景下,托管威胁检测响应服务(MDR)应运而生。MDR能够利用现代安全运营中心的技术和专业人员,为客户提供全天候的安全监测和快速响应,从而缩短威胁发现和响应之间的窗口期,降低风险并减轻安全运营压力。
402 1
|
JavaScript Windows
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
[Vue]解决 Windows PowerShell 不识别 vue 命令的问题
|
存储 SQL 分布式计算
云计算与大数据期末考试题库(二)
云计算与大数据期末考试题库(二)
1044 0