/*执行bash命令*/ void execBashCmd(){ execOuterCmd(BashCmd); }
/*执行命令*/ void execSimpleCmd(SimpleCmd *cmd){ int i, pid; char *temp; Job *now = NULL; if(strcmp(cmd->args[0], "exit") == 0) { //exit命令 exit(0); } else if (strcmp(cmd->args[0], "history") == 0) { //history命令 if(history.end == -1){ printf("尚未执行任何命令\n"); return; } i = history.start; do { printf("%s\n", history.cmds[i]); i = (i + 1)%HISTORY_LEN; } while(i != (history.end + 1)%HISTORY_LEN); } else if (strcmp(cmd->args[0], "jobs") == 0) { //jobs命令 if(head == NULL){ printf("尚无任何作业\n"); } else { printf("index\tpid\tstate\t\tcommand\n"); for(i = 1, now = head; now != NULL; now = now->next, i++){ printf("%d\t%d\t%s\t\t%s\n", i, now->pid, now->state, now->cmd); } } } else if (strcmp(cmd->args[0], "cd") == 0) { //cd命令 temp = cmd->args[1]; if(temp != NULL){ if(chdir(temp) < 0){ printf("cd; %s 错误的文件名或文件夹名!\n", temp); } } } else if (strcmp(cmd->args[0], "fg") == 0) { //fg命令 temp = cmd->args[1]; if(temp != NULL && temp[0] == '%'){ pid = str2Pid(temp, 1, strlen(temp)); if(pid != -1){ fg_exec(pid); } }else{ printf("fg; 参数不合法,正确格式为:fg %<int>\n"); } } else if (strcmp(cmd->args[0], "bg") == 0) { //bg命令 temp = cmd->args[1]; if(temp != NULL && temp[0] == '%'){ pid = str2Pid(temp, 1, strlen(temp)); if(pid != -1){ bg_exec(pid); } } else{ printf("bg; 参数不合法,正确格式为:bg %<int>\n"); } } else{ //外部命令 execOuterCmd(cmd); } //释放结构体空间 for(i = 0; cmd->args[i] != NULL; i++){ free(cmd->args[i]); free(cmd->input); free(cmd->output); } }
/*执行命令*/ void execSimpleCmd(SimpleCmd *cmd){ int i, pid; char *temp; Job *now = NULL; if(strcmp(cmd->args[0], "exit") == 0) { //exit命令 exit(0); } else if (strcmp(cmd->args[0], "history") == 0) { //history命令 if(history.end == -1){ //printf("尚未执行任何命令\n"); printf("there has no command before\n"); return; } i = history.start; do { printf("%s\n", history.cmds[i]); i = (i + 1)%HISTORY_LEN; } while(i != (history.end + 1)%HISTORY_LEN); } else if (strcmp(cmd->args[0], "jobs") == 0) { //jobs命令 if(head == NULL){ //printf("尚无任何作业\n"); printf("no jobs now\n"); } else { printf("index\tpid\tstate\t\tcommand\n"); for(i = 1, now = head; now != NULL; now = now->next, i++){ printf("%d\t%d\t%s\t\t%s\n", i, now->pid, now->state, now->cmd); } } } else if (strcmp(cmd->args[0], "cd") == 0) { //cd命令 temp = cmd->args[1]; if(temp != NULL){ if(chdir(temp) < 0){ //printf("cd; %s 错误的文件名或文件夹名!\n", temp); printf("cd; %s wrong files or floder name\n", temp); } } } else if (strcmp(cmd->args[0], "fg") == 0) { //fg命令 temp = cmd->args[1]; if(temp != NULL && temp[0] == '%'){ pid = str2Pid(temp, 1, strlen(temp)); if(pid != -1){ fg_exec(pid); } }else{ //printf("fg; 参数不合法,正确格式为:fg %<int>\n"); printf("fg; illegal parameter, right form:fg %<int>\n"); } } else if (strcmp(cmd->args[0], "bg") == 0) { //bg命令 temp = cmd->args[1]; if(temp != NULL && temp[0] == '%'){ pid = str2Pid(temp, 1, strlen(temp)); if(pid != -1){ bg_exec(pid); } } else{ //printf("bg; 参数不合法,正确格式为:bg %<int>\n"); printf("bg; illegal parameter, right form:bg %<int>\n"); } } else if(strcmp(cmd->args[0], "mykill") == 0){// mykill 命令 temp = cmd->args[1]; if( temp != NULL){ pid = str2Pid(temp,0,strlen(temp)); kill(pid,SIGKILL); } else{ printf("mykill; ilegal parameter, right form:mykill <int>\n"); } } else if (strcmp(cmd->args[0], "myecho") == 0){//myecho命令 if( cmd->args[1] != NULL) { for(i = 1; cmd->args[i] != NULL; i++) printf("%s ", cmd->args[i]); } printf("\n"); }else{ //外部命令 execOuterCmd(cmd); } //释放结构体空间 for(i = 0; cmd->args[i] != NULL; i++){ free(cmd->args[i]); free(cmd->input); free(cmd->output); } }