📄 shell_minix.c
字号:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <unistd.h> #include <sys/wait.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#define MAXSIZE 100int main(void) { char *read_order(char *buffer); char **order_name(const char *input); int pipel(char * input); int pipe_number(const char *input); int redirect(char *input); int order_number(const char *input); char *path,*buffer; char *all_order,**every_order; int i,pipe,k,number; if((buffer=(char *)malloc(MAXSIZE*(sizeof(char))))==0) { printf("error! can't malloc enough space for buffer\n"); return (0); } while(1) { path=getcwd(NULL,0); printf("@myShell@"); all_order=read_order(buffer); if(all_order==NULL) continue; number=order_number(all_order); if (number<0) continue; every_order=order_name(all_order); i=0; while (i<number) { if(strlen(every_order[i])!=0) { k=pipe_number(every_order[i]); if(k!=0) pipel(every_order[i]); else redirect(every_order[i]); } i++; } for(i=0;i<number;i++) free(every_order[i]); free(every_order); free(all_order); free(path); }}char **order_name(const char *input){ int order_number(const char *input); int i,j,k,max_len; char **order; max_len=strlen(input); k=order_number(input); order=(char **)malloc(k*sizeof(char *)); for(i=0;i<k;i++) { order[i]=(char *)malloc((max_len+1)*sizeof(char)); order[i][0]='\0'; } k=0; j=0; for (i=0;i<=max_len;i++) { if (input[i]!=';') { order[k][j]=input[i]; j++; } else { order[k][j]='\0'; k++; j=0; } } return order;}int order_number(const char *input){ int sum=0,i=0,len; len=strlen(input); while(i<len&&(input[i]==' '||input[i]==' ')) i++; if(input[i]==';') { fprintf(stderr," syntax error near unexpected token: ;\n"); return -1; } if (i==len) return -1; for (i=0;i<len;i++) if(input[i]==';') { while(i<strlen(input)&&(input[i+1]==' '||input[i+1]==' ')) i++; if(input[i+1]==';') { fprintf(stderr," syntax error near unexpected token: ;;\n"); return -1; } else sum++; } sum=sum+1; return sum;}int pipel(char * input){ int redirect(char *input); int is_back(char *order); int pipe_number(const char *input); int status,i,j,k,**fd,back=0,len; char **order; int *child; back=is_back(input); len=strlen(input); k=pipe_number(input); order=(char **)malloc((k+1)*sizeof(char *)); for(i=0;i<k+1;i++) order[i]=(char *)malloc((len+1)*sizeof(char)); child=(int *)malloc((k+1)*sizeof(char *)); fd=(int **)malloc(k*sizeof(int *)); for(i=0;i<k;i++) fd[i]=(int *)malloc(2*sizeof(int)); k=0; j=0; for (i=0;i<=len;i++) { if (input[i]!='|') { order[k][j]=input[i]; j++; } else { order[k][j]='\0'; k++; j=0; } } for(i=0;i<k;i++) if(pipe(fd[i]) == -1) { fprintf(stderr, "Open pipe error !\n"); return 0; } i=0; if((child[i]=fork())==0) { close(fd[i][0]); if(fd[i][1] != STDOUT_FILENO) { if(dup2(fd[i][1], STDOUT_FILENO) == -1) { fprintf(stderr, "Redirect Standard Out error !\n"); return -1; } close(fd[i][1]); } redirect(order[i]); exit(1); } else { waitpid(child[i],&status,0); close(fd[i][1]); } i++; while(i<k) { if ((child[i]=fork())==0) { if(fd[i][0] != STDIN_FILENO) { if(dup2(fd[i-1][0], STDIN_FILENO) == -1) { fprintf(stderr, "Redirect Standard In error !\n"); return -1; } close(fd[i-1][0]); if(dup2(fd[i][1], STDOUT_FILENO) == -1) { fprintf(stderr, "Redirect Standard Out error !\n"); return -1; } close(fd[i][1]); } redirect(order[i]); exit(1); } else { waitpid(child[i],&status,0); close(fd[i][1]); i++; } } if((child[i] = fork()) == 0) { close(fd[i-1][1]); if(fd[i-1][0] != STDIN_FILENO) { if(dup2(fd[i-1][0], STDIN_FILENO) == -1) { fprintf(stderr, "Redirect Standard In error !\n"); return -1; } close(fd[i-1][0]); } redirect(order[i]); exit(1); } else if(back==0) { waitpid(child[i], NULL, 0); close(fd[i-1][1]); } for(i=0;i<k;i++) free(fd[i]); free(fd); for(i=0;i<k+1;i++) free(order[i]); free(order); free(child); return 1;}int pipe_number(const char *input){ int sum=0,i; for (i=0;i<strlen(input);i++) if(input[i]=='|') sum++; return sum;}void do_cd(char *argv[]){ if(argv[1]!=NULL) { if(chdir(argv[1])<0) switch(errno) { case ENOENT: fprintf(stderr,"DIRECTORY NOT FOUND\n"); break; case ENOTDIR: fprintf(stderr,"NOT A DIRECTORY NAME\n"); break; case EACCES: fprintf(stderr,"YOU DO NOT HAVE RIGHT TO ACCESS\n"); break; default: fprintf(stderr,"SOME ERROR HAPPENED IN CHDIR\n"); } }} int redirect(char *input){ char **analize(const char *input); char *is_file_exist(const char *order); void do_cd(char *argv[]); int number(const char *input); int is_back(char *order); int pipe_number(const char *input); char *order_path,*real_order; char *out_filename,*in_filename; char **analized_order; int len,status,i,j,k,back=0,fd_out,fd_in,flag_out=0,flag_in=0; pid_t pid; back=is_back(input); len=strlen(input); out_filename=(char *)malloc((len+1)*(sizeof(char))); in_filename=(char *)malloc((len+1)*(sizeof(char))); real_order=(char *)malloc((len+1)*(sizeof(char))); for(i=0;i<len;i++) { if (input[i]!='>'&&input[i]!='<') real_order[i]=input[i]; else { if (input[i]=='>') flag_out=1; if (input[i]=='<') flag_in=1; break; } } real_order[i]='\0'; i++; if(flag_out==1&&input[i]=='>') { flag_out=2; i++; } else if (flag_in==1&&input[i]=='<') { flag_in=2; i++; } while ((input[i]==' '||input[i]==' ')&&i<len) i++; j=0; out_filename[0]='\0'; in_filename[0]='\0'; if(flag_out>0) { while (i<=len) { if(input[i]=='<') { out_filename[j]='\0'; break; } out_filename[j]=input[i]; i++; j++; } } if(flag_in>0) while (i<=len) { if (input[i]=='>') { in_filename[j]='\0'; break; } in_filename[j]=input[i]; i++; j++; } if (i<len) { j=0; if (flag_out>0&&input[i]=='<') { i++; flag_in=1; if(input[i]=='>') { flag_in=2; i++; } while ((input[i]==' '||input[i]==' ')&&i<len) i++; while (i<=len) { in_filename[j]=input[i]; i++; j++; } } else if (flag_in>0&&input[i]=='>') { i++; flag_out=1; if(input[i]=='>') { flag_out=2; i++; } while ((input[i]==' '||input[i]==' ')&&i<len) i++; while (i<=len) { out_filename[j]=input[i]; i++; j++; } } else { fprintf(stderr,"ERROR!can't find the file!\n"); return -1; } } k=number(real_order); analized_order=analize(real_order); if(strcmp(analized_order[0], "leave") == 0) { printf("bye-bye\n"); for(i=0;i<k;i++) free(analized_order[i]); free(analized_order); free(real_order); exit(1); return 1; } if (strcmp(analized_order[0],"cd")==0) { do_cd(analized_order); for(i=0;i<k;i++) free(analized_order[i]); free(analized_order); free(real_order); return 1; } order_path=is_file_exist(analized_order[0]); if(order_path==NULL) { fprintf(stderr,"This is command is not founded ?!\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -