【发布时间】:2019-10-07 19:41:54
【问题描述】:
我的任务是创建一个嵌套的 Unix shell,它使用 fork/exec/wait 模型执行命令。其中一条指令指出,如果命令不存在(如“cd”,那么我需要打印尝试的命令。例如(如果输入是 cd,则输出是“cd: command not found.”)
但我终其一生都无法弄清楚如何打印输入的命令。
我声明了一个数组,尝试使用 scanf,尝试从 char ** 转换为 char * 或转换为 int;我尝试暴力破解它都没有奏效。
代码如下:
int main() {
char **command;
char *input;
pid_t child_pid;
int stat_loc;
char arg[20];
while (1)
{
input = readline("minor2> ");
command = get_input(input);
if(!command[0])
{
free(input);
free(command);
continue;
}
else if(command[0]=="quit")
{
exit(1);
}
child_pid = fork();
if (child_pid == 0)
{
/*Never returns if call is a success*/
execvp(command[0], command);
printf("%s", arg);
printf(": command not found.\n");
}
else
{
waitpid(child_pid, &stat_loc, WUNTRACED);
}
free(input);
free(command);
}
char **get_input(char *input) {
char **command = malloc(8 * sizeof(char *));
char *separator = " ";
char *parsed;
int index = 0;
parsed = strtok(input, separator);
while (parsed != NULL) {
command[index] = parsed;
index++;
parsed = strtok(NULL, separator);
}
command[index] = NULL;
return command;
}
我收到的一些错误: “赋值从指针生成整数,无需强制转换-wint-conversion”
“转换为不同大小的整数指针”
“需要 1 个值作为赋值的左操作数”
我只是感到困惑。我确信有一个优雅的解决方案,只是我没有足够的经验来解决它。
【问题讨论】:
-
什么是
get_input?它有什么作用?你在哪里(如果在任何地方)定义它?您在哪里(如果在任何地方)声明它?请花一些时间刷新how to ask good questions,以及this question checklist。最后请不要忘记如何创建minimal reproducible example 向我们展示。 -
为清晰起见编辑
-
这一行没有意义:
(char *) arg[20] = commandarg[20] 超出了arg数组的末尾,其类型为char。将其转换为char *会导致未定义的行为。 -
那是我最后一次尝试获得可打印声明的尝试。它肯定没有用。
-
我认为您需要退后几步,重新开始学习基本的 C 知识,因为您似乎错过了一些知识。