if (input[i] == ' ' || input[i] =='\\t' || input[i] == '\\0'){ if (j == 0) /*这个条件可以略去连在一起的多个空格或者tab*/ continue; else{ buffer[j++] = '\\0'; arg[k] = (char *) malloc(sizeof(char)*j); /*将指令或参数从缓存拷贝到arg中*/ strcpy(arg[k],buffer); j = 0; /*准备取下一个参数*/ k++; } } else{ /*如果字串最后是‘&',则置后台运行标记为1*/ if (input[i] == '&' && input[i+1] == '\\0'){ is_back = 1; continue; } buffer[j++] = input[i]; } } free(input);/*释放空间*/ /*如果输入的指令是leave则退出while,即退出程序*/ if (strcmp(arg[0],\ printf(\ break; } if (is_bj == 0){ /*非管道、重定向指令*/
/*在使用xxec执行命令的时候,最后的参数必须是NULL指针, *所以将最后一个参数置成空值*/ arg[k] = (char *) 0; /*判断指令arg[0]是否存在*/ if (is_fileexist(arg[0]) == -1 ){ printf(\ for(i=0;i 31 /* fork a sub-process to run the execution file */ if ((pid = fork()) ==0) /*子进程*/ execv(buffer,arg); else /*父进程*/ if (is_back == 0) /*并非后台执行指令*/ waitpid(pid,&status,0); /*释放申请的空间*/ for (i=0;i int is_fileexist(char *comm) { char *path,*p; int i; i = 0; /*使用getenv函数来获取系统环境变量,用参数PATH表示获取路径*/ path = getenv(\ p = path; while (*p != '\\0'){ /*路径列表使用‘:’来分隔路径*/ if (*p != ':') buffer[i++] = *p; else{ buffer[i++] = '/'; buffer[i] = '\\0'; /*将指令和路径合成,形成pathname,并使用access函数来判断该文件是否存在*/ strcat(buffer,comm); if (access(buffer,F_OK) == 0) /*文件被找到*/ return 0; else /*继续寻找其它路径*/ i = 0; } p++; } /*搜索完所有路径,依然没有找到则返回-1*/ return -1; 32 } int redirect(char *in,int len) { char *argv[30],*filename[2]; 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; /*这里是重定向的命令解析过程,其中filename用于存放重定向文件, *is_in, is_out分别是输入重定向标记和输出重定向标记*/ 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] == '<'){ /*重定向指令最多'<','>'各出现一次,因此num最大为2, *否则认为命令输入错误*/ if (num < 3){ num ++; if (in[i] == '<') is_in = num - 1; else is_out = num - 1; /*处理命令和重定向符号相连的情况,比如ls>a*/ if (j > 0 && num == 1) { buffer[j++] = '\\0'; argv[k] = (char *) malloc(sizeof(char)*j); strcpy(argv[k],buffer); k++; j = 0; } } else{ printf(\ return -1; } } if (j == 0) continue; else{ buffer[j++] = '\\0'; /*尚未遇到重定向符号,字符串是命令或参数*/ 33 if (num == 0){ argv[k] = (char *) malloc(sizeof(char)*j); strcpy(argv[k],buffer); k++; } /*是重定向后符号的字符串,是文件名*/ else{ filename[status] = (char *) malloc(sizeof(char)*j); strcpy(filename[status++],buffer); } j = 0; /*initate*/ } } else{ if (in[i] == '&' && in[i+1] == '\\0'){ is_back = 1; continue; } buffer[j++] = in[i]; } } argv[k] = (char *) 0; if (is_fileexist(argv[0]) == -1 ){ printf(\ for(i=0;i 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(\ return -1; } /*存在输入重定向*/ if (is_in != -1) if((fd_in=open(filename[is_in],O_RDONLY,S_IRUSR|S_IWUSR))==-1){ 34
相关推荐: