在C中使用execvp执行单独的命令

时间:2012-05-19 17:17:45

标签: 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(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);
    }

当我在execvp(*arguments,*argumentsCount)中执行命令时,它失败了。

怎么了?

谢谢。

编辑:

来自用户的输入是:ls > a.out,因此我有3个字符串,它们是:

ls>a.out,它失败了。

3 个答案:

答案 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);