文件重定向及shell(重定向)实现

文件重定向

定义:将原来从标准输入读取数据的文件操作重新定向为从向其他文件读取数据;将原来要输出到标准输出的内容,从新定向输出到指定的其他文件

文件重定向指令

<     //标准输重定向
>     //标准输出重定向   清空原先的内容后添加新的内容 
>>    //标准输出重定向   在原来内容换行下方添加新的内容

dup及dup2函数

int dup(int oldfd);
//复制oldfd的文件描述符
//举个例子:fd=dup(1); 表述向fd所指的文件描述符代表文件中写入数据,实际就是向标准输出(1)写入数据。则结果:写入数据会被打印到屏幕。

int dup2(int oldfd,int newfd);
//将newfd描述符从指向原本的文件,重新修改指向指向到oldfd所指向的文件去。
//如果newfd原先有指向的文件,那么那个文件将会被关闭。close(fd);会被系统调用

模拟shell实现

#include
#include
#include
#include
#include 
#include 
#include "fcntl.h"
int main()
{
	while(1)
	{
		printf("[cq@localhost]$ ");
		fflush(stdout);

		char tmp[1024] = {0};
		scanf("%[^\n]%*c",tmp);
		printf("[%s]\n",tmp);
		//"ls -a -l" ->"ls" "-a" "-l"
		char *argv[32] = {NULL};
		int argc = 0;
		char *ptr = NULL;
		ptr = tmp;
//重定向解析
    int redirect_flag = 0;
    char *redirect_file = NULL;
    while(*ptr != '\0')
    {
      if(*ptr == '>')
      {
        *ptr = '\0';
        ptr++;
        redirect_flag = 1;
          if(*ptr == '>')
          {
            *ptr = '\0';
            ptr++;
            redirect_flag = 2;
          }
        while(isspace(*ptr) && *ptr != '\0') ptr++;
       redirect_file = ptr;
       while(!isspace(*ptr) && *ptr != '\0' )ptr++;
       *ptr = '\0';
      }
      ptr++;
    }


		ptr = tmp;
//命令解析
		while(*ptr !='\0')
		{
			if(!isspace(*ptr))
			{
				argv[argc] = ptr;
				argc++;
				while(!isspace(*ptr) && *ptr != '\0') ptr++;
				*ptr = '\0';
				ptr++;
				continue;
			}
			ptr++;
		}
		argv[argc] = NULL;
		//判断当前命令是否是内建命令
		if(!strcmp(argv[0],"cd"))
		{
			chdir(argv[1]);
			continue;
		}

//创建子进程,运行要执行的命令
		int pid = fork();
		if(pid == 0)
		{
      int fd = 1;
      if(redirect_flag == 1)
      {
        fd = open(redirect_file,O_CREAT|O_WRONLY|O_TRUNC,0664);
      }else if(redirect_flag == 2)
      {
        fd = open(redirect_file,O_CREAT|O_WRONLY|O_APPEND,0664);
      }
      //重定向,把要写入标准输出1的内容写到自己指定的文件
      dup2(fd,1);
			execvp(argv[0],argv);
			//若子进程程序替换失败,则直接退出,应为==因为终端不需要多个shell
			exit(0);
		}
		//等待子进程退出
		wait(NULL);
	}
	return 0;
}

运行结果

文件重定向及shell(重定向)实现_第1张图片

你可能感兴趣的:(Linux)