
作業(yè)社區(qū)
探索學(xué)習(xí)新天地,共享知識(shí)資源!
weixin_慕哥3021856 的學(xué)生作業(yè):
#include #include #include #include #include #define MAX_ARGS 20 // 最大參數(shù)數(shù)量 int main(void) { pid_t cpid; char order[256]; // 用戶(hù)輸入的內(nèi)容 char *args[MAX_ARGS]; // 命令參數(shù) char *token = NULL; // 用于分割字符串的臨時(shí)指針 int status = 0; // 子進(jìn)程的狀態(tài) while (1) { printf("minishell> "); fflush(stdout); if (fgets(order, sizeof(order), stdin) == NULL) { printf("\n"); break; } // 移除輸入末尾的換行符 order[strcspn(order, "\n")] = '\0'; int i = 0; // 分割用戶(hù)的輸入為命令和參數(shù) token = strtok(order, " "); while (token && i < MAX_ARGS - 1) { args[i++] = token; token = strtok(NULL, " \t"); } // 參數(shù)數(shù)組以NULL結(jié)尾 args[i] = NULL; // 跳過(guò)空輸入(如回車(chē)) if (!args[0]) continue; // 內(nèi)置命令exit if (strcmp(args[0], "exit") == 0) break; // 創(chuàng)建子進(jìn)程來(lái)執(zhí)行命令 cpid = fork(); if (cpid == -1) { perror("Failed to fork()"); continue; } else if (cpid == 0) { // 子進(jìn)程執(zhí)行命令 execvp(args[0], args); // 若execvp返回,表示執(zhí)行失敗 perror("Failed to execvp()"); exit(EXIT_FAILURE); } else { // 父進(jìn)程等待子進(jìn)程退出 waitpid(cpid, &status, 0); } } return 0; }




