0

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

     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 , 失败了。

4

3 回答 3

2

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

  • 使用 system() 代替,并在它返回时退出

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

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

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

于 2012-05-19T17:41:27.433 回答
1

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

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


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

于 2012-05-19T17:34:53.387 回答
1

从 execvp 命令的手册页:

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

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

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

execvp(arguments[0],arguments);
于 2012-05-19T17:34:54.417 回答