自己实现一个命令解释器bash完成一些简单的功能(mybash),fgets()与gets()的区别,stork()函数

mybash的简单实现

fgets与gets的区别

fgets会读取到我们的回车符\n
gets不会读取到\n
bash只是帮你执行程序不包含程序

stork()函数

系统提供的方法strtok在<string.h>中
它会将数组里的分隔符全部换为\0(字符数组首地址)内部有全局变量的指针记录分隔的位置返回cp的地址a.c的地址b.c的地址;
第一次输入首位置第二次都是NULL在原来的字符串上直接分割
在这里插入图片描述

margv[]存放各个字段的数组数组;替换的参数

1 #include<stdlib.h>
  2 #include<assert.h>
  3 #include<stdio.h>
  4 #include<unistd.h>
  5 #include<string.h>
  6 #include<fcntl.h>
  7 #include<sys/wait.h>
  8 char* Get_cmd(char buff[],char*myargv[])
  9 {
 10     if(buff==NULL||myargv==NULL)
 11     {
 12     return NULL;
 13     }
 14  int i=0;
 15  char*s=strtok(buff," ");//分隔的地方变为\0
 16  while(s!=NULL)
 17  {
 18   myargv[i++]=s;
 19   s=strtok(NULL," ");
 20  }
 21  return myargv[0];
 22 }
 23 
 24 int main(int gra,char*argv[],char*envp[])
 25 {
 26  while(1)
 27   {
 28    char buff[128]={};
 29    printf("\033[1;32mstu@stu-virtual-machine:\033[0m~$");
 30    fflush(stdout);
 31    fgets(buff,128,stdin);
 32    buff[strlen(buff)-1]=0;//"\0"fget会把\n也获得
 33      char*myargv[10]={};
 34    char*cmd= Get_cmd(buff,myargv);
 35    if(cmd==NULL)
 36    {
 37     continue;
 38    }
 39    else if(strcmp(cmd,"exit")==0)
 40    {
 41     break;
 42    }
 43    else if(strcmp(cmd,"cd")==0)
 44    {
 45     //chdir();
 46    }
 47    else
 48    {
 49      //fork+exec
 50      pid_t pid=fork();
 51     if(pid==-1)
 52     {
 53      printf("fork erro\n");
 54      continue;
 55     }
 56     if(pid==0)
 57     {
 58     execvp(cmd,myargv);
 59     printf("execvp erro\n");
 60     exit(0);
 61     }
 62     wait(NULL);
 63    }
 64   }
 65 exit(0);
 66 }                                 

在这里插入图片描述

内置命令

exit和cd和其他的命令不同
在这里插入图片描述

注意\033只是一个字符
在这里插入图片描述
尝试增加功能
cd 还有第一行的当前位置的打印
看书Linux程序设计第三四章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值