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

标签: shell
11人阅读 评论(1) 收藏 举报
分类:

重定向的原理是关闭相应的标准流文件描述符(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文件:
这里写图片描述

查看评论

Shell—输入/输出重定向

本文主要讲解Shell的输入/输出重定向的相关知识 一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这...
  • ltaihyy
  • ltaihyy
  • 2016-12-20 00:10:24
  • 707

Linux-基础IO之文件描述符和重定向

系统调用函数 在了解文件描述符之前,先来认识几个系统接口,即系统调用函数 open(),close() read() ,write() 进程是通过调用open函数来打开一个已经存在的文件或创...
  • zgege
  • zgege
  • 2018-03-24 23:29:27
  • 22

Shell学习之:输入输出重定向

详细理解: linux命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。在linux she...
  • Jerry_1126
  • Jerry_1126
  • 2014-08-17 10:15:44
  • 4256

【Linux 系统编程】shell 输入/输出重定向

source: http://blog.csdn.net/u011974987/article/details/52703400 前言 原本计划国庆节第一天假期休息一天,但是想想自...
  • frankarmstrong
  • frankarmstrong
  • 2016-12-06 15:11:14
  • 1937

shell脚本学习11——输入输出重定向

Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。 输出重定向 命令的输出...
  • Watson2016
  • Watson2016
  • 2016-08-30 12:50:12
  • 1827

【Linux 系统编程】shell 输入/输出重定向(四)

前言原本计划国庆节第一天假期休息一天,但是想想自己还有很多事情没有完成,就立马打开电脑,开始干活了。打算这7天的假期好好整理下之前学的技术和巩固练习,充实每一天,好了入正题,Linux shell脚本...
  • u011974987
  • u011974987
  • 2016-10-01 15:51:28
  • 1974

shell的特性之十:输入输出重定向和管道

I/O设备:就是把信息输入进计算机,然后计算机把信息反馈输出的设备,例如输入设备:键盘,输出设备:显示器。就是I/O设备 每个设备内部都有寄存器,这个寄存器是用来和计算机的CPU交互的 键盘上每次敲...
  • lz_equal
  • lz_equal
  • 2016-06-23 16:06:55
  • 793

shell 输出重定向(> >> 2>&1)

1、首先,bash中0,1,2三个数字分别代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制...
  • feng27156
  • feng27156
  • 2014-09-01 15:32:28
  • 23501

shell基础-输入输出以及重定向/多命令顺序执行与管道符/通配符与特殊符号

这个  2  与  >>之间是连着的。 把正确和错误输出全部都写入同一个文件: 8行8个单词,45个字符。单词之间以空格判断,行之间以回车判断。...
  • wangfei8348
  • wangfei8348
  • 2015-08-20 23:33:53
  • 770

Shell的输入和输出(echo,read,cat,管道,tee,重定向等)

从echo的变量开始说起...
  • skyyunmi
  • skyyunmi
  • 2007-02-09 09:31:00
  • 1602
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 531
    排名: 9万+
    文章分类