我已经为这个简单的 Linux shell 苦苦挣扎了几个小时,由于某种原因,我无法让最基本的东西正常工作。我如何处理我的输入或其他东西严重搞砸了,因为这个 shell 如何不起作用的一个例子是 mkdir 命令。它随机不会创建一个我从未尝试创建的随机目录,每次我创建一个目录时,它都会设法创建一些其他具有我显然没有创建的随机名称的目录。有些东西搞砸了,我只是不知道,因为我一直在输出我的最终参数数组,从那里看起来很好。有人可以帮我看看这个吗?
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>
int main(int argc, char *argv[]){
while(1){
char line[100], *temp, *split[15];
int child_id;
printf("$ ");
fgets(line, sizeof(line), stdin);
line[strlen(line)-1] = ' ';
temp = strtok(line, " ");
int i = 0;
while(temp != NULL){
split[i] = temp;
temp = strtok(NULL, " ");
i++;
}
char *args[i];
int j;
for(j = 0; j < i; j++){
args[j] = split[j];
printf("%sn", args[j]);
}
child_id = fork();
if(child_id == 0){
execvp(args[0], args);
exit(0);
}else{
wait(&child_id);
}
}
}
使用 execvp()
时,args
数组的最后一个元素必须NULL
(这告诉内核命令行参数列表的结束位置)。
您应该能够通过在strtok()
循环后添加split[i] = NULL;
来做到这一点(哦,并且无需将数组复制到args
如上面的评论中所述,只需使用 split
)。