我已将用户的给定命令分为子串,这是代码:
int i;
char *line = malloc(BUFFER);
char *origLine = line;
fgets(line, 128, stdin); // get a line from stdin
// get complete diagnostics on the given string
lineData info = runDiagnostics(line);
char command[20];
sscanf(line, "%20s ", command);
line = strchr(line, ' ');
printf("The Command is: %s\n", command);
int currentCount = 0; // number of elements in the line
int *argumentsCount = ¤tCount; // pointer to that
// get the elements separated
char** arguments = separateLineGetElements(line,argumentsCount);
// here we call a method that would execute the commands
if (execvp(*arguments,*argumentsCount) < 0) // execute the command
{
printf("ERROR: exec failed\n");
exit(1);
}
当我在execvp(*arguments,*argumentsCount)
中执行命令时,它失败了。
怎么了?
谢谢。
编辑:
来自用户的输入是:ls > a.out
,因此我有3个字符串,它们是:
ls
,>
,a.out
,它失败了。
答案 0 :(得分:2)
如果您没有调用shell,则Shell重定向将不起作用。 你也没有路径搜索来找到ls程序。一些选项
改为使用system(),并在返回时退出
执行一个shell并让它运行你的命令
设置重定向作为shell,然后fork并执行每个必需的子程序。
你的命令也没有多大意义,你可能想要|而不是&gt;并且可能需要指定a.out的目录(如果它不在您的路径中)。考虑给它一个有意义的名字。
答案 1 :(得分:1)
在命令行运行ls > a.out
时,>
和a.out
不是传递给应用程序的参数;它们被shell解释为重定向标准输出。
简而言之,不可能做你想做的事。 1
<子> 1。嗯,确实如此,但不是这样。您的应用程序需要解释参数,创建文件,并设置流重定向。
答案 2 :(得分:1)
从execvp命令的手册页:
int execvp(const char *file, char *const argv[]);
第二个参数是一个以空字符结尾的C字符串列表,作为execvp
要执行的命令的参数。但是在你的代码中,你传递int
作为第二个参数,这是错误的。
如果变量arguments
中有参数列表,则将execvp调用为:
execvp(arguments[0],arguments);