📄 backups.txt
字号:
/*获取用户输入*/
while((c=getchar())==' '||c=='\t'||c==EOF)
;
if(c=='\n')
continue;
while(c!='\n')
{
buf[input_len++]=c;
c=getchar();
}
buf[input_len]='\0';
input=(char *)malloc(sizeof(char)*(input_len+1));
strcpy(input,buf);
/*解析命令*/
/**管道命令和重定向命令**/
for(i=0,j=0,k=0;i<=input_len;i++)
if(input[i]=='<'||input[i]=='>'||input[i]=='|')
{
if(input[i]=='|')
{
pipel(input,input_len);
addHistory(input);
free(input);
}
else
{
redirect(input,input_len);
addHistory(input);
free(input);
}
is_pr=1;
break;
}
/**普通命令**/
if(is_pr==1)
continue;
for(i=0,j=0,k=0;i<=input_len;i++)
{
if(input[i]==' '||input[i]=='\0')
{
if(j==0)
continue;
else
{
buf[j++]='\0';
arg[k]=(char *)malloc(sizeof(char)*j);
strcpy(arg[k++],buf);
j=0;
}
}
else
{
if(input[i]=='&'&&input[i+1]=='\0')
{
is_bg=1;
continue;
// }
// buf[j++]=input[i];
// }
// }
//
// /**内部命令**/
// /***exit命令***/
// if(strcmp(arg[0],"exit")==0)
// {
// addHistory(input);
// printf("Bye!\n");
// free(input);
// break;
// }
// /***history命令***/
// if(strcmp(arg[0],"history")==0)
// {
// addHistory(input);
// history_cmd();
// free(input);
// continue;
// }
// /***cd命令***/
// if(strcmp(arg[0],"cd")==0)
// {
// addHistory(input);
// for(i=3,j=0;i<=input_len;i++)
// buf[j++]=input[i];
// buf[j]='\0';
// arg[1]=(char *)malloc(sizeof(char)*j);
// strcpy(arg[1],buf);
// cd_cmd(arg[1]);
// free(input);
// continue;
// }
// /***jobs命令***/
// if(strcmp(arg[0],"jobs")==0)
// {
// addHistory(input);
// jobs_cmd();
// free(input);
// continue;
// }
// /***bg命令***/
// if(strcmp(arg[0],"bg")==0)
// {
// addHistory(input);
// for(i=0;i<=input_len;i++)
// if(input[i]=='%')
// break;
// for(++i;i<=input_len;i++)
// buf[j++]=input[i];
// buf[j]='\0';
// arg[1]=(char *)malloc(sizeof(char)*j);
// strcpy(arg[1],buf);
// bg_cmd(atoi(arg[1]));
// free(input);
// continue;
// }
// /***fg命令***/
// if(strcmp(arg[0],"fg")==0)
// {
// addHistory(input);
// for(i=0;i<=input_len;i++)
// if(input[i]=='%')
// break;
// for(++i;i<=input_len;i++)
// buf[j++]=input[i];
// buf[j]='\0';
// arg[1]=(char *)malloc(sizeof(char)*j);
// strcpy(arg[1],buf);
// fg_cmd(atoi(arg[1]));
// free(input);
// continue;
// }
//
// /*寻找命令文件*/
// if(is_pr==0)
// {
// arg[k]=(char *)malloc(sizeof(char));
// arg[k]=NULL;
// if(isFounded(arg[0])==0)
// {
// printf("This command is not founded!\n");
// for(i=0;i<=k;i++)
// free(arg[i]);
// continue;
// }
// }
// addHistory(input);
//
// /*执行命令*/
// if((pid=fork())==0)
// {
// if(is_bg==1)
// while(sig_flag==0)
// signal(SIGUSR1,setFlag);
// sig_flag=0;
// execv(buf,arg);
// }
// else
// {
// pid1=pid;
// if(is_bg==1)
// {
// addNode(input,pid1);
// kill(pid,SIGUSR1);
// pid1=0;
// }
// if(is_bg==0)
// waitpid(pid,&status,0);
// }
// if(is_bg==1)
// sleep(1);
// for(i=0;i<k;i++)
// free(arg[i]);
// free(input);
// }
//
int redirect(char *in,int len)
{
char *argv[20],*filename[20];
pid_t pid;
int i,j,k,fd_in,fd_out,is_in=-1,is_out=-1,num=0;
int is_back=0,status=0;
/*命令解析*/
for(i=0,j=0,k=0;i<=len;i++)
{
if(in[i]==' '||in[i]=='\t'||in[i]=='\0'||in[i]=='<'||in[i]=='>')
{
if(in[i]=='>'||in[i]=='<')
{
if(num<3)
{
num++;
if(in[i]=='<')
is_in=num-1;
else
is_out=num-1;
if(j>0&&num==1)
{
buf[j++]='\0';
argv[k]=(char *)malloc(sizeof(char)*j);
strcpy(argv[k],buf);
k++;
j=0;
}
}
else
{
printf("Error command!\n");
return 0;
}
}
if(j==0)
continue;
else
{
buf[j++]='\0';
if(num==0)
{
argv[k]=(char *)malloc(sizeof(char)*j);
strcpy(argv[k],buf);
k++;
j=0;
}
else
{
filename[status]=(char *)malloc(sizeof(char)*j);
strcpy(filename[status++],buf);
j=0;
}
}
}
else
{
if(in[i]=='&'&&in[i+1]=='\0')
{
is_back=1;
continue;
}
buf[j++]=in[i];
}
}
/*寻找命令文件*/
argv[k]=(char *)malloc(sizeof(char));
argv[k]=(char *)0;
if(isFounded(argv[0])==0)
{
printf("This command is not founded!\n");
for(i=0;i<=k;i++)
free(argv[i]);
return 0;
}
/*命令的执行*/
if((pid=fork())==0)
{
if(is_out!=-1)
{
if((fd_out=open(filename[is_out],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR))==-1)
{
printf("Can't open %s \n",filename[is_out]);
return 0;
}
}
if(is_in!=-1)
{
if((fd_in=open(filename[is_in],O_RDONLY,S_IRUSR|S_IWUSR))==-1)
{
printf("Can't open %s \n",filename[is_out]);
return 0;
}
}
if(is_out!=-1)
{
if(dup2(fd_out,STDOUT_FILENO)==-1)
{
printf("Redirect standard out error!\n");
exit(1);
}
}
if(is_in!=-1)
{
if(dup2(fd_in,STDIN_FILENO)==-1)
{
printf("Redirect standard in error!\n");
}
}
printf("%s\n",buf);
printf("%s\n",argv);
execv(buf,argv);
}
else
{
if(is_back==0)
waitpid(pid,&status,0);
}
/*释放空间*/
for(i=0;i<=k;i++)
free(argv[i]);
if(is_out!=-1)
{
free(filename[is_out]);
close(fd_out);
}
if(is_in!=-1)
{
free(filename[is_in]);
close(fd_in);
}
return 0;
}
/*命令解析*/
for(i=0,j=0,k=0;i<=len;i++)
{
if(input[i]==' '||input[i]=='\t'||input[i]=='\0'||input[i]=='<'||input[i]=='>'||input[i]=='\n')
{
if(input[i]=='|'||input[i]=='>')
{
if(input[i]=='>')
flag=1;
if(j>0)
{
buf[j++]='\0';
argv[li_cmd][k]=(char *)malloc(sizeof(char)*j);
strcpy(argv[li_cmd][k],buf);
k++;
}
argv[li_cmd][k]=(char *)0;
li_cmd++;
k=0;
j=0;
}
if(j==0)
continue;
else
{
buf[j++]='\0';
if(flag==0)
{
argv[li_cmd][k]=(char *)malloc(sizeof(char)*j);
strcpy(argv[li_cmd][k],buf);
k++;
}
else
{
filename[0]=(char *)malloc(sizeof(char)*j);
strcpy(filename[0],buf);
}
}
j=0;
}
else
{
if(input[i]=='&'&&input[++i]=='\0')
{
is_bg=1;
continue;
}
buf[j++]=input[i];
}
}
argv[li_cmd][k++]=NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -