Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用execvp执行单独的命令_C_Linux_Shell_Unix_Exec - Fatal编程技术网

在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 = &currentCount;   // 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:我以前回答过你的两个问题,你从来没有接受过任何答案……嗯,