C:传递数组代替变量参数列表

时间:2012-04-10 01:29:01

标签: c exec variadic-functions

我在C中编写一个简单的shell。它实际上与i / o重定向等相当好。我想补充的一件事是在exec *函数的版本之间切换。现在我坚持使用execlp(),execvp()和execve()。

我想要在名为argv的数组中传递所有参数。它是一个以null结尾的空终止字符串数组,因此它可以与execv *一起使用,但我想不出如何使用execlp()。

这就是我现在所拥有的:

if     (strcmp(exec_opt, "vp") == 0)
  error = execvp(argv[0], argv);          /* Execute vp */
else if(strcmp(exec_opt, "lp") == 0)
  error = execlp(argv[0], "", argv);      /* Execute lp */
else if(strcmp(exec_opt, "ve") == 0)
  error = execve(argv[0], argv, environ); /* Execute ve */
else
{
  // throw errors about exec_opt
}

if(error != 0)
{
  // do something about it
}

在此配置中,编译器不会对语法产生影响,但它也不起作用。 我也试过了

 error = execlp(argv[0], (char*) argv);  /* As a single string */
 char* argv1 = argv[1];                  /* don't pass command itself */
 error = execlp(argv[0], argv1);         

各种奇怪但最终不正确的事情。有没有办法让我把我的数组变成一个变量参数列表?直接传递它(因为变量参数列表是char* argv[],因此它具有最大的类型意义)会产生关于转换不兼容指针的编译器错误。

2 个答案:

答案 0 :(得分:0)

您无法在阵列中使用execlp()。要使用execlp(),您必须写出:

execlp(array[0], array[0], (char *)0);
execlp(array[0], array[0], array[1], (char *)0);
execlp(array[0], array[0], array[1], array[2], (char *)0);
execlp(array[0], array[0], array[1], array[2], array[3], (char *)0);
...

为每个替代数量的参数。这就是为什么execvp()被添加到曲目中的原因(1978年它不是7th Edition UNIX™的一部分,而是1997年SUS v2的一部分)。现在你只需要execvpe(),它不存在AFAIK(我不知道为什么它没有提供)。


7 th Edition UNIX确实有excevp()

戴夫说:

  

第7版手册列出了execvp

而且......确实如此。我认为我们有一个错误报告,因为手册实际上包含:

  

NAME

     

execl,execv,execle,execve,execlp,execvp,exec,exece,environ - 执行文件

     

概要

execl(name, arg0, arg1, ..., argn, 0)
char *name, *arg0, *arg1, ..., *argn;
execv(name, argv)
char *name, *argv[ ];
execle(name, arg0, arg1, ..., argn, 0, envp)
char *name, *arg0, *arg1, ..., *argn, *envp[ ];
execve(name, argv, envp);
char *name, *argv[ ], *envp[ ];
extern char **environ;
     

描述

因此,execvp()列在NAME部分,但没有execvp()的概要(这是我看到的结论,它缺少了)。在下一页上有execvp()的引用:

  使用与 execl execv 相同的参数调用

Execlp execvp ,但复制shell的操作在目录列表中搜索可执行文件。目录列表是从环境中获取的。

所以,我原谅自己是因为我扫描了大纲,并且在概要中省略了execvp()。但实际上,系统调用存在于第7版Unix中。我认为任何人都不会重新发布手册,并且省略了修改。

我的打印副本(是的,我打印了第1卷(ISBN 0-03-061742-1)和第2卷(ISBN 0-03-061743-X)的正确绑定版本从那时开始的手册;我在大约1989年获得它们)在概要部分中有相同的遗漏。

答案 1 :(得分:0)

尝试使用avcall。我自己没有使用它,我在这里发现了一个有趣的提及:Passing parameters dynamically to variadic functions