【Linux】实现一个minishell

本文介绍了如何实现一个minishell,包括解析用户输入,创建子进程执行命令,以及添加重定向功能。通过程序替换在shell中处理外部命令,并详细阐述了重定向的实现过程,但未涉及错误处理和自动补全等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完成一个minishell,其中可以实现简单的命令解释,以及重定向符号功能。

首先实现命令解释的思路:

  • 获取用户输入内容
  • 解析获取到的内容,得到命令及其参数
  • 创建子进程
  • 程序替换

shell中处理外部命令是通过创建子进程后程序替换完成功能,还有一部分命令是内建命令,也就是shell自身实现的功能,比如cd。

重定向实现思路

  •  解析字符串,重定向符号前是命令及参数,后面是文件名称
  • 在子进程程序替换之前,按照解析出的重定向方式打开文件
  • 使用dup2(int oldfd,int newfd);将oldfd描述符对应的描述信息向newfd中拷贝一份

后面就进行程序替换即可。

具体代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>

int main()
{
  while(1)
  {
  printf("[wg@minihost ~]$");
  fflush(stdout);

  char tmp[1024] = {0};
  scanf("%[^\n]%*c",tmp);
  printf("[%s]\n",tmp);

  //需要将整体字符串解析成   命令名称+参数  的形式
  char* ptr=tmp;
  int redirect_flag=0;//用来标志不同的重定向符号
  char* redirect_file=NULL;
  while(*ptr!='\0')
  {
    if(*ptr=='>')
    {
       redirect_flag=0;
       *ptr='\0';
       ptr++;
       if(*ptr=='>')
       {
         redirect_flag=2;
         *ptr='\0';
         pte++;
       }
     while(isspace(*ptr) && *ptr!='\0')
        ptr++;
     redirect_file=ptr;
     while(!isspace(*ptr) && *ptr!='\0')
        ptr++;
     ptr='\0';
     ptr++;
     continue;
    }
    ptr++;
  }
  
  ptr=tmp;
  char* argv[32]={NULL};
  int argc=0;

  while(*ptr!='\0')
  {
     if(!isspace(*ptr))
     {
        argv[argc]=ptr;
        argc++;
        while(!issapce(*ptr) && *ptr!='\0')
          ptr++;
        *ptr='\0';
        ptr++;
        continue;
     }
     ptr++;
  }
  argv[argc]=NULL;
  if(!strcmp(argv[0],"cd"))
  {
     chdir(argv[1];
  }

  int pid=fork();
  if(pid==0)
  {
     int fd=1;
     if(redirect_flag==1)
     {
         fd=open(redirect_file,O_CREAT|O_WRONLY|O_TRUNC,0664);
     }
     else if(redirect_flag==2)
            {
                fd=open(redirect_file,O_CREAT|O_WRONLY|O_ADDEND,0664);
            }
     dup2(fd,1);
     execvp(argv[0],argv);
     exit(0);
  }
  wait(NULL);//等待子进程退出,避免僵尸进程
  }
return 0;

}

运行结果:

命令解释:

重定向实现:

 

没有容错及自动补全等等的功能。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值