我正在尝试编写一个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);
答案 0 :(得分:1)
论证buffer
错了。 execvp
的第二个参数是一个指针数组。使用此强制转换,您将隐藏编译器警告,但它不起作用。
答案 1 :(得分:1)
我可以在这看到几个潜在的问题。
首先,您使用malloc
分配空间(意味着内容未初始化),但立即使用strcat
写入空间。除非(通过任何改变)第一个字符是'\0'
,否则会留下一个以垃圾开头的字符串,然后是你想要放在那里的数据。它(也很容易)导致写入缓冲区的末尾,给出未定义的行为。
如果由我决定,我认为我会使用sprintf
代替strcat
。至少您展示的内容可以解决:sprintf(str, "./%43s.out", cmd);
答案 2 :(得分:0)
两个问题: