在构造的字符串上使用execvp的问题

时间:2012-12-08 17:21:26

标签: c string execvp

我正在尝试编写一个shell,它的一部分构造是从用户输入的字符串(缓冲区)执行代码。但是,当我尝试用额外的输入(ae.echo a)来执行字符串时,它总是将pooch拧紧并返回-1。我不知道为什么。以下是相关部分:

char * buffer = calloc(100, sizeof(char));
...
fgets(buffer, 100, stdin);
buffer[strlen(buffer) - 1] = 0; // necessary because of a newline inserted by fgets
...
cmd = strsep(&buffer, " ");
char * str = malloc(50 * sizeof(char));
strcat(str, "./");
strcat(str, cmd);
strcat(str, ".out");
...
i = execvp(str, (char * *) buffer);

3 个答案:

答案 0 :(得分:1)

论证buffer错了。 execvp的第二个参数是一个指针数组。使用此强制转换,您将隐藏编译器警告,但它不起作用。

答案 1 :(得分:1)

我可以在这看到几个潜在的问题。

首先,您使用malloc分配空间(意味着内容未初始化),但立即使用strcat写入空间。除非(通过任何改变)第一个字符是'\0',否则会留下一个以垃圾开头的字符串,然后是你想要放在那里的数据。它(也很容易)导致写入缓冲区的末尾,给出未定义的行为。

如果由我决定,我认为我会使用sprintf代替strcat。至少您展示的内容可以解决:sprintf(str, "./%43s.out", cmd);

答案 2 :(得分:0)

两个问题:

  1. 您正在将未初始化的字符串传递给第一个strcat。
  2. execvp需要一个字符串数组,而不是一个带有空格分隔字段的字符串。