在C中使用execvp执行单独的命令
我已将给定命令从用户分离为子字符串,下面是代码:在C中使用execvp执行单独的命令,c,linux,shell,unix,exec,C,Linux,Shell,Unix,Exec,我已将给定命令从用户分离为子字符串,下面是代码: 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(l
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);
}
inti;
char*line=malloc(缓冲区);
char*origLine=直线;
fgets(第128行,标准格式);//从stdin那里得到一条线路
//获取给定字符串的完整诊断信息
lineData信息=运行诊断(线路);
char命令[20];
sscanf(行,“%20s”,命令);
行=strhr(行“”);
printf(“命令为:%s\n”,命令);
int currentCount=0;//行中的元素数
int*argumentsCount=¤tCount;//指向那个的指针
//把元素分开
char**arguments=separateLineElements(行,argumentsCount);
//这里我们调用一个方法来执行命令
如果(execvp(*arguments,*argumentscont)<0)//执行命令
{
printf(“错误:exec失败\n”);
出口(1);
}
当我在execvp(*arguments,*argumentsCount)
中执行命令时,它失败了
怎么了
谢谢
编辑:
用户的输入是:ls>a.out
,因此我有3个字符串,它们是:
ls
,
,a.out
,它失败了 在命令行上运行ls>a.out
时,
和a.out
不是传递给应用程序的参数;它们被shell解释为重定向标准输出
所以简而言之,你不可能做你想做的事
一,。是的,但不是这样。应用程序需要解释参数、创建文件并设置流重定向。在命令行上运行
ls>a.out
时,
和a.out
不是传递给应用程序的参数;它们被shell解释为重定向标准输出
所以简而言之,你不可能做你想做的事
一,。是的,但不是这样。您的应用程序需要解释参数、创建文件并设置流重定向。来自execvp命令的手册页:
int execvp(const char *file, char *const argv[]);
第二个参数是以null结尾的C字符串列表,这些字符串作为execvp
要执行的命令的参数。但是在代码中,您传递了一个int
作为第二个参数,这是错误的
如果变量arguments
中有参数列表,则调用execvp作为:
execvp(arguments[0],arguments);
从execvp命令的手册页:
int execvp(const char *file, char *const argv[]);
第二个参数是以null结尾的C字符串列表,这些字符串作为execvp
要执行的命令的参数。但是在代码中,您传递了一个int
作为第二个参数,这是错误的
如果变量arguments
中有参数列表,则调用execvp作为:
execvp(arguments[0],arguments);
如果不调用Shell,Shell重定向将无法工作。您也没有路径搜索来查找ls程序。一些选择
- 改为使用system(),并在返回时退出
- 执行shell并让它运行您的命令
- 像shell一样设置重定向,然后分叉并执行每个必需的子程序
另外,您的命令也没有多大意义,您可能希望使用△而不是>,如果a.out不在您的路径中,则可能需要指定其目录。考虑一下也给它一个有意义的名字。如果你没有调用shell, shell重定向是不起作用的。您也没有路径搜索来查找ls程序。一些选择
- 改为使用system(),并在返回时退出
- 执行shell并让它运行您的命令
- 像shell一样设置重定向,然后分叉并执行每个必需的子程序
另外,您的命令也没有多大意义,您可能希望使用△而不是>,如果a.out不在您的路径中,则可能需要指定其目录。考虑给它一个有意义的名字。这是失败的原因,但也请注意下面的Oli的答案。即使您将参数固定为execvp,也将使用参数
和a.out
执行ls
,这将查找名为
的文件,然后查找名为a.out
的文件。那可能不是你的意思。我以为罗伯回答了那部分。创建新进程时,重定向不起作用。系统命令在使用命令和参数的方式上会更直接。而且ls>a.out没有多大意义。我想这不是wante要做的。使用system命令,它只是:system(“ls>myfile”);你也可以看看popen
@KingsIndian:我不能用它,我需要用execvp
。我想我需要对代码做一点修改以使其生效。这是失败的原因,但也请注意下面Oli的答案。即使您将参数固定为execvp,也将使用参数
和a.out
执行ls
,这将查找名为
的文件,然后查找名为a.out
的文件。那可能不是你的意思。我以为罗伯回答了那部分。创建新进程时,重定向不起作用。系统命令在使用命令和参数的方式上会更直接。而且ls>a.out没有多大意义。我想这不是wante要做的。使用system命令,它只是:system(“ls>myfile”);你也可以看看popen
@KingsIndian:我不能用它,我需要用execvp
。我想我需要对代码做一点修改,以使其生效。好吧,你可以execvp(“/bin/sh”、[“-c”,“你的shell命令在这里])
@OliCharlesworth:你能给出一个修复这个bug的例子吗,就像你建议的那样?谢谢。@ron:我以前回答过你的两个问题,你从来没有接受过任何答案……嗯,