【Linux】模拟实现linux的shell

#include 
#include 
#include 
#include 
#include 
#include 
#define NUM 1024
#define SIZE 32
#define SEP " "
int main()
{
  //保存输入后的字符串
  char cmd_line[NUM];
  //保存打散后的字符串
  char *g_argv[SIZE];
  //打印出提示信息
  while(1)
  {
    printf("[root@localhost myshell]# ");
    //刷新缓冲区
    fflush(stdout);
    //对cmd_line进程初始化
    memset(cmd_line,'\0',sizeof cmd_line);
    //获取用户键盘输入
    if(fgets(cmd_line,sizeof cmd_line,stdin) == NULL)
    {
      continue;
      //输入错误就重新执行输入操作
    }
    //因为fgets是读取回车的,所以我们要把字符串的最后一位给去掉
    cmd_line[strlen(cmd_line)-1] = '\0';
    //这里读取写出来的都是一整串字符串,例如 ls -l -a
    // printf("echo: %s\n", cmd_line);
    // 那吗如果我们想要执行输入的命令就要对其进行分解
    // 分解成:"ls"  "-a"  "-l"
    g_argv[0] = strtok(cmd_line,SEP);//第一次调用的时候,要传入要分解的字符串,第二次调用的时候就可以将要分解的字符串位置写为NULL
 
    int index = 1;
 
    if(strcmp(g_argv[0], "ls") == 0)
        {
            g_argv[index++] = "--color=auto";
        }
        if(strcmp(g_argv[0], "ll") == 0)
        {
            g_argv[0] = "ls";
            g_argv[index++] = "-l";
            g_argv[index++] = "--color=auto";
        }
    
    while(g_argv[index++] = strtok(NULL, SEP));
    //因为我们这个原理为子进程替换,所以当执行cd命令的时候,我们就没有办法来返回,或者到达一个位置
    //内置命令, 让父进程(shell)自己执行的命令,我们叫做内置命令,内建命令
    //内建命令本质其实就是shell中的一个函数调用
    if(strcmp(g_argv[0],"cd") == 0)
    {
      if(g_argv[1]!=NULL)chdir(g_argv[1]);
      continue;
    }

    //进行进程分割,子进程和父进程
    pid_t id = fork();
    if(id == 0)
    {
      //子进程
      printf("下面功能是子进程运行的\n");
      execvp(g_argv[0],g_argv);
      exit(1);
    }
    else if(id > 0)
    {
      int statu = 0;
      pid_t ret = waitpid(id,&statu,0);
      if(ret > 0) printf("exit code: %d\n", WEXITSTATUS(statu));
    }
  
  }
  
  return 0;
}

【Linux】模拟实现linux的shell_第1张图片

你可能感兴趣的:(Linux,linux)