Linux 实现一个带有重定向功能的shell_linux中页面重定向功能实现

45 阅读1分钟
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

int main()
{
    while (1)
    {
        printf("[WhiteShirtI@shell workspace]$ ");
        fflush(stdout);//刷新标准输出缓冲区
        //1、等待标准输入
        char buf[1024] = { 0 };
        fgets(buf, 1023, stdin);//将输入的数据放在buf中
        buf[strlen(buf) - 1] = '\0';//将最后一个换行取消
        //1.5解析重定向
        //ls -ls > a.txt
        char \*ptr = buf;
        int flag = 0;
        char \*redirect_file = NULL;//文件名
        while (\*ptr != '\0')
        {
            if (\*ptr == '>')
            {
                flag = 1;//清空重定向
                \*ptr = '\0';//将>替换成结尾标志,则命令解析到此位置就结束了
                 ptr++;
                 if (\*ptr == '>')
                 {
                     flag = 2;//追加重定向
                      ptr++;
                       
                  }
                  while (\*ptr == ' ' && \*ptr != '\0')
                       {
                           ptr++; //将a.txt之前的空格走完
                       }
                       redirect_file = ptr;//让redirect\_file指针指向a.txt中a的位置
                       while(\*ptr != ' ' && \*ptr != '\0')
                       {
                            ptr++;//将a.txt字符走完
                       }
                       \*ptr = '\0';
                        ptr++;  
              }
             }
                //2、对输入命令数据进行读取解析
                char \*argv[32] = {NULL};
                int argc = 0;
                ptr = buf;
                // [ ls -a -l ]
                while (\*ptr != '\0')
                {
                        if (\*ptr != ' ')
                        {
                                argv[argc++] = ptr;
                                while (\*ptr != ' ' && \*ptr != '\0')
                                {
                                        ptr++;
                                }
                                \*ptr = '\0';
                 		}
                        ptr++;
        		 }
	      argv[argc] = NULL;//最后一个参数位置的下一个位置置NULL
	      //3、创建子进程,在子进程中进行程序替换
	      pid_t pid = fork();
	      if (pid == 0)//子进程
	      {
	         if (flag == 1)//清空重定向
	         {
	             int fd = open(redirect_file, O_WRONLY|O_CREAT|O_TRUNC,0664);
	              dup2(fd, 1);//将标准输入重定向到redirect\_file中,原本要打印的数据就会被写到文件中
	          }
	              else if (flag == 2)//追加重定向
	              {
	                  int fd = open(redirect_file, O_WRONLY|O_CREAT|O_APPEND,0664);
	                  dup2(fd, 1);//将标准输入重定向到redirect\_file中,原本要打印的数据就会被写到文件中
	               }
	                  execvp(argv[0],argv);//程序替换成功就不会执行下面代码,而去执行新的程序
	                  perror("execvp error");//打印上一次系统调用接口使用的错误原因
	                  exit(0);
	       }
	        //4、父进程进程等待