我有一个任务,我们必须创建一个shell。部分内容包括使用生成不同unix命令的路径。 (例如:/ bash / ls)。使用execv,如果我对路径进行硬编码,我可以使一切工作正常,但如果我生成它则不行。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/syscall.h>
#include <unistd.h>
void command(char *args[]);
int main (int argc, char **argv) {
//get the command and arguments
char buffer[32];
char *b = buffer;
size_t bufferSize = 32;
int counter = 0;
char *tokens[10];
char *delims = " \t\n";
printf("dash> ");
getline(&b, &bufferSize, stdin);
tokens[0] = strtok(buffer, delims);
while (tokens[counter] != NULL) {
counter++;
tokens[counter] = strtok(NULL, delims);
}
command(tokens);
}
void command(char *args[]) {
//create path
char *path = NULL;
int length = strlen(args[0]);
path = malloc(5 + length + 1);
strcat(path, "/bin/");
strcat(path, args[0]);
char *input[2];
input[0] = malloc(512);
strcpy(input[0], path);
printf(input[0]); //the path prints out properly
//input[0] = "/bin/ls"; <--- this works!
input[1] = NULL;
//start execv
pid_t pid;
pid = fork();
if(pid < 0) {
printf("ERROR: fork failed.");
exit(0);
}
else if (pid == 0) {
execv(input[0], input);
printf("error.");
}
free(path);
free(input[0]);
}
有人有主意吗?我很确定它与malloc存在问题,但我不确定如何规避它。
qazxsw poi问题,因为你正在阅读qazxsw poi,这个
getline()
在stdin
结束时存储新线getline(&b, &bufferSize, stdin);
char当你通过\n
到buffer
函数时,tokens
将是command()
而不是args
这就是为什么ls\n
失败了
execv:没有这样的文件或目录
因此,删除额外的ls
字符以正确解析execv
,例如
\n