我正在編寫一個C程序來模擬一個簡單的shell。這個shell基本上像其他shell(ls,cat等)一樣評估命令,以及處理流水線和重定向。C程序中的shell程序有奇怪的行爲
目前,我試圖通過獲取用戶輸入令牌化它展開,取出,並執行提供的命令(例如,只執行「LS」,而不是「ls -l命令」)。但是,我在分叉方面遇到很多困難。似乎每次我分叉時,出現了一些錯誤,並創建了數百個相同的進程,導致我的計算機被凍結,我不得不重新啓動。該代碼似乎是正確的,但我不知道是什麼導致此行爲。以下是我的代碼(主要方法和輸入標記器方法)的相關部分。
int main() {
char inputLine[512]; //user input
char *args[10]; //arguments
char* pathVar = "/bin/";//path for argument
char programPath[512]; //pathVar + args[0]
int n; //count variable
//loop
while (1) {
//print prompt, get input
printf("input> ");
fgets(inputLine, 512, stdin);
n = tokenizer(inputLine, args);
//fork process
pid_t pid = fork();
if (pid != 0) { //if parent
wait(NULL);
} else { //if child
//format input for execution
strcpy(programPath, pathVar);
strcat(programPath, args[0]);
//execute user command
int returnVal = execv(programPath, args);
}
}
return 0;
}
int tokenizer(char *input, char *args[]) {
char *line; //current line
int i = 0; //count variable
line = input;
args[i] = strtok(line, " ");
do {
i++;
line = NULL;
args[i] = strtok(line, " ");
} while (args[i] != NULL);
return i;
}
什麼是 「出錯」 是什麼意思?你有沒有嘗試過在exec中更簡單一些 - 或者更換exec--來隔離問題?你有沒有嘗試打印出programPath,以確保它是你認爲它應該是什麼? – keshlam
我已經確定在嘗試執行exec之前,令牌化等工作。用戶輸入被正確標記(參數用空格分隔)並且程序路徑正確地形成(例如「/ bin/ls」)。大問題似乎與分叉有關。 – user41419
您在子進程中執行的命令不會在控制檯上寫入 –