【问题标题】:Executing a separated command using execvp in C在 C 中使用 execvp 执行单独的命令
【发布时间】:2012-05-19 17:17:44
【问题描述】:

我已经将用户的给定命令分成子字符串,这是代码:

     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 &gt; a.out,因此我有 3 个字符串,它们是:

ls&gt;a.out,它失败了。

【问题讨论】:

    标签: c linux shell unix exec


    【解决方案1】:

    如果您不调用外壳程序,外壳程序重定向将不起作用。 你也不会通过路径搜索来找到 ls 程序。一些选项

    • 改用system(),返回时退出

    • 执行一个 shell 并让它运行你的命令

    • 像 shell 一样设置重定向,然后派生并执行每个所需的子程序。

    此外,您的命令没有多大意义,您可能想要 ¦ 而不是 > 并且可能需要指定 a.out 的目录(如果它不在您的路径中)。考虑给它起一个有意义的名字。

    【讨论】:

      【解决方案2】:

      来自 execvp 命令的手册页:

         int execvp(const char *file, char *const argv[]);
      

      第二个参数是以 null 结尾的 C 字符串列表,作为 execvp 要执行的命令的参数。但是在您的代码中,您传递了一个 int 作为错误的第二个参数。

      如果变量arguments 中有参数列表,则调用 execvp 为:

      execvp(arguments[0],arguments);
      

      【讨论】:

      • 这是失败的原因,还要注意下面奥利的回答。即使您将参数固定为 execvp,您也将使用参数 &gt;a.out 执行 ls,这将查找名为 &gt; 的文件,然后查找名为 a.out 的文件。这可能不是你的意思。
      • 我以为 Rob 回答了那部分。当您创建一个新进程时,您的重定向不起作用。使用命令和参数的方式,系统命令会更直接。
      • Also ls > a.out 没有多大意义。我想这不是我想做的。
      • 用系统命令,很简单:system("ls > myfile");也可以看popen
      • @KingsIndian:我不能用,我需要用execvp。我想我会稍微更改一下代码以使其正常工作。
      【解决方案3】:

      当您在命令行运行ls &gt; a.out 时,&gt;a.out 不是传递给应用程序的参数;它们被 shell 解释为重定向标准输出。

      所以简而言之,做自己想做的事是不可能的。1


      1。嗯,它是,但不是这样。您的应用程序需要解释参数、创建文件并设置流重定向。

      【讨论】:

      • 嗯,你可以execvp("/bin/sh",["-c","your shell commands here"])
      • @OliCharlesworth:你能举个例子来修复这个错误,就像你建议的那样吗?谢谢。
      • @ron:我之前回答过你的两个问题,但你从来没有接受过任何答案......
      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2016-03-03
      • 2014-03-20
      • 1970-01-01
      相关资源
      最近更新 更多