小项目minishell

该程序是一个简单的命令行解释器,它读取用户输入的命令,解析命令行参数,处理内置命令如cd,并使用fork和execvp在子进程中执行外部命令。当命令是ls或ll时,程序会自动添加颜色选项。父进程则通过waitpid等待子进程的结束并获取退出状态。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>

#define NUM 1024
#define SIZE 32 
#define SEP " " //命令行分隔符

//保存完整的命令行字符串
char cmd_line[NUM];
//保存分割后的命令行字符串
char* g_argv[SIZE];
    //shell运行原理:子进程执行命令,父进程等待&&解析命令
int main()
{
   //命令行解释器是一个常驻内存的进程不退出
   while(1)
   {
       //1.打印命令提示符
       printf("[root@LocalHost myshell]# ");
       //fflush(stdout);
       memset(cmd_line,'\0',sizeof(cmd_line));
       
       //2.获取用户的键盘输入信息
       if(fgets(cmd_line,sizeof cmd_line,stdin)==NULL)
       {
           continue;
       }
       //  gets(cmd_line);
       cmd_line[strlen(cmd_line)-1]='\0';
       //printf("%s\n",cmd_line);

       //3.解析命令行信息 "ls -a -l -i" -> "ls" "-a" "-l" "-i"
       //strtok
       g_argv[0]=strtok(cmd_line,SEP);
       int index=1;
       if(strcmp("ls",g_argv[0])==0)
       {
           g_argv[index++]="--color=auto";
       }

       if(strcmp("ll",g_argv[0])==0)
       {
           g_argv[0]="ls";
           g_argv[index++]="-l";
           g_argv[index++]="--color=auto";
       }
       while(g_argv[index++]=strtok(NULL,SEP));
      // int i=0;
      // for(i=0;g_argv[i];i++)
      // {
      //     printf("g_argv[%d]:%s\n",i,g_argv[i]);
      // }
      
       //4.内置命令 让父进程(shell)自己执行的命令,我们叫做内置命令,内建命令
       //内建命令本质其实就是shell中的一个函数调用
       if(strcmp("cd",g_argv[0])==0)
       {
           if(g_argv[1]) chdir(g_argv[1]);
           continue;
       }
      
      //5.fork子进程,执行命令
        pid_t id = fork();
       if(id==0)
       {
           printf("下面是子进程执行的\n");
           execvp(g_argv[0],g_argv);
           exit(1);
       }
       int status=0;
       pid_t ret=waitpid(id,&status,0);
       if(ret>0)
       {
           printf("exit code:%d\n",WEXITSTATUS(status));
       }
   }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值