重定向:重定向就是把原来文件所指的方向重新定位到新的文件。重定向的实质就是对文件描述符的重定向,我们通过文件描述符可以操作这个文件描述符所指向文件,现在我们将这个文件描述符所指向的文件换成另外一个文件,用户就可以通过原来的那个文件描述符来访问这个新的文件信息了
追加重定向>> :直接在文件原有内容的末尾追加内容。
清空重定向> :先清空文件的原有内容再向其中添加内容。
文件不存在则会先创建一个
那么我就在之前完成的minishell中添加重定向功能:minishell实现及原理详解
步骤:
- 解析字符串,重定向符号前是命令,重定向后是要重定向到的文件名称
- 在子进程程序替换前,按解析的重定向方式打开文件
- 使用dup2,将oldfd描述符对应的描述信息向newfd中拷贝一份
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>
#include<ctype.h>
#include<fcntl.h>
int main() {
while(1){
printf("[MXS@localhost]$");
fflush(stdout);
char tmp[1024]={0};
scanf("%[^\n]%*c",tmp);
char *ptr=tmp;
int redirect_flag=0; //标记重定向方式
char *redirect_file=NULL;
while(*ptr!='\0'){
if(*ptr=='>'){
*ptr='\0';
redirect_flag=1; //‘>’为清空重定向
ptr++;
if(*ptr=='>'){
*ptr='\0';
redirect_flag=2; //'>>'为追加重定向
ptr++;
}
while(isspace(*ptr)&&*ptr!='\0')
ptr++;
redirect_file=ptr;
while(!isspace(*ptr)&&*ptr!='\0')
ptr++;
*ptr='\0';
}
ptr++;
}
ptr=tmp;
int argc=0;
char *argv[32]={NULL};
while(*ptr!='\0'){
if(!isspace(*ptr)){
argv[argc]=ptr;
argc++;
while(!isspace(*ptr)&&*ptr!='\0'){
ptr++;
}
*ptr='\0';
ptr++;
continue;
}
ptr++;
}
argv[argc]=NULL;
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);
}
dup2(fd,1); //将标准输出重定向到我们指定的文件中
execvp(argv[0],argv);
exit(0);
}
wait(NULL);
}
return 0;
}