支持输入、输出、追加重定向的shell

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_______zhang/article/details/79953261

重定向的原理是关闭相应的标准流文件描述符(stdin(0)、stdout(1)、stderr(2)),打开要重定向的文件并得到文件描述符,因为Linux中文件描述符的分配是从0开始查找第一个没有使用的描述符进行分配,所以打开的文件描述符便会代替标准流文件的描述符达到重定向的作用。
代码如下:

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
//1.建立一个子进程(fork)
//2.在子进程中获取命令行
//3.在子进程中解析命令行,并判断是那种重定向替换相应的文件描述符
//4.替换子进程(execvp)
//5.父进程等待子进程退出(wait)


void Run(char *buf,char *argv[]){
  while(1){
    //打印提示符
    printf("[MyShell]$");
    fflush(stdout);
    //创建子进程
    pid_t id = fork();
    if(id < 0){
      perror("fork");
    }else if(id == 0){
      //子进程
      char *str = NULL;
      int argc = 0;
      //获取命令行
      gets(buf);
      //判断是那种重定向,并替换相应文件描述符
      if(str = strstr(buf,">>")){
    //追加重定向
    *str = '\0';
    str++;
    str++;
    while(*str == ' '){
      str++;
    }
    //关闭标准输出,并打开追加重定向要追加的文件
    close(1);
    int fd = open(str,O_WRONLY|O_APPEND);
    if(fd != 1){
      perror("open");
      return;
    }
      }else if(str = strstr(buf,"<")){
    //输入重定向
    *str = '\0';
    str++;
    while(*str == ' '){
      str++;
    }
    //关闭标准输入,并打开输入重定向要输入的文件
    close(0);
    int fd = open(str,O_RDONLY);
    if(fd != 0){
      perror("open");
      return;
    }
    //获取文件内容,得到命令
    gets(buf);
      }else if(str = strstr(buf,">")){
    //输出重定向
    *str = '\0';
    str++;
    while(*str == ' '){
      str++;
    }
    //关闭标准输出,并打开输出重定向要输出的文件
    close(1);
    int fd = open(str,O_WRONLY|O_CREAT,0644);
    if(fd != 1){
      perror("open");
      return;
    }
      }
      //解析命令
      argv[argc] = strtok(buf," ");
      while(argv[argc]){
    argv[++argc] = strtok(NULL," ");
      }
      //子进程程序替换
      execvp(argv[0],argv);
      perror("execvp");
    }else{
      //父进程等待子进程
      wait(NULL);
    }
  }
}

int main(){
  char buf[1024] = {0};
  char *argv[8] = {NULL};
  Run(buf,argv);
  return 0;
}

效果演示:
正常命令:
这里写图片描述
tmp文件:
这里写图片描述
输入重定向:
这里写图片描述
输出重定向及输出重定向后的tmp1文件:
这里写图片描述
追加重定向及追加重定向后的tmp1文件:
这里写图片描述

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页