【发布时间】:2016-02-26 06:34:53
【问题描述】:
当我输入ls 时,我会收到两次此消息:ls: cannot access : No such file or directory。但是当我输入类似ls -l /tmp 或执行位于路径中的“c”代码时,一切都很好。任何想法出了什么问题?
我的代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
for (;;) {
char *cmd,*splitcmd,*pr0,*pr1,*pr2;
int i, j, nargc = 0, characters;
char **cmdArray;
size_t bufsize = 1024;
pid_t pid, wpid;
int status = 0;
printf("Type a command : \n");
cmd = (char *) malloc(bufsize * sizeof(char));
characters = getline(&cmd, &bufsize, stdin);
// printf("cmd===> %s characters===> %d \n",cmd,characters);
if (cmd[characters-1] == '\n')
{
cmd[characters-1] = '\0';
characters--;
}
// printf("cmd===> %s characters===> %d \n",cmd,characters);
cmdArray = (char**) malloc(bufsize * sizeof(char *));
for (i = 0 ; i < bufsize ; i++)
{
cmdArray[i] = (char*) malloc(bufsize*sizeof(char));
}
splitcmd = strtok(cmd," ");
// printf(" cmd==== %s\n",cmd);
while ((splitcmd))
{
cmdArray[nargc] = splitcmd;
if (cmdArray[nargc][(strlen(cmdArray[nargc])) - 1] == ' ')
cmdArray[nargc][(strlen(cmdArray[nargc]))-1] == '\0';
// printf(" nargc====%d cmdArray===[ %s ] \n",nargc,cmdArray[nargc]);
nargc++;
pr0 = cmdArray[0];
pr1 = cmdArray[1];
pr2 = cmdArray[2];
splitcmd = strtok(NULL," ");
//printf(" pr0 %s \n",pr0);
//printf(" pr1 %s \n",pr1);
//printf(" pr2 %s \n",pr2);
}
if ((pid = fork()) == 0)
{
char *argv[] = {pr0, pr1, pr2, NULL};
execvp(argv[0],argv);
for (int i = 0; i < 100; i++) {
free(cmdArray[i]);
}
free(cmdArray);
}
wait(&status);
}
}
【问题讨论】:
-
请修正你的代码,缩进和格式化等。不要将
void *的结果转换成c。 -
代码可以编译吗?而且你不能执行c 代码。
-
看来
pr1和pr2将指向ls案例的垃圾数据。换句话说,cmdArray[1]和cmdArray[2]在这种情况下是未初始化的。在命令标记被完全拆分之前,在while循环内设置pr0、pr1、pr2至少会令人困惑。 -
它编译并且我可以执行它。但是当我输入
ls输入时,我会收到ls: cannot access ...消息。 @iharob -
啊!所以你知道你正在使用垃圾值并且你仍然继续这样做并且没有尝试修复它或告诉我们你故意在代码中留下错误?如果您确实已经知道这是一个问题,至少您可以指出这一点。解决方法是编写代码来处理不同数量的参数,方法是使
argv成为动态大小的数组,并仅使用正确的参数填充它。