1

我正在用 C 编写一个简单的 shell。它实际上与 i/o 重定向等配合得很好。我想添加的一件事是一种在 exec* 函数版本之间切换的方法。现在我坚持使用 execlp()、execvp() 和 execve()。

我有我想在一个名为 argv 的数组中传递的所有参数。它是一个空终止字符串的空终止数组,因此它可以与 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[])会产生关于强制转换不兼容指针的编译器错误。

4

2 回答 2

1

你不能真正使用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 年不是第 7 版 UNIX™</a> 的一部分,而是在 1997 年成为SUS v2的一部分)。现在您只需要execvpe()AFAIK 不存在的 (我也不知道为什么不提供它)。


7版 UNIX 确实有excevp()

戴夫说:

第 7 版手册确实列出了execvp.

而且......它确实,部分。我认为我们需要报告一个勘误表,因为该手册实际上包含:

姓名

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()下一页有参考:

Execlpexecvp使用与execlexecv相同的参数调用,但重复了 shell 在目录列表中搜索可执行文件的操作。目录列表是从环境中获取的。

所以,我原谅自己,因为我浏览了概要并execvp()从概要中被省略了。但实际上,系统调用存在于第 7 版 Unix 中。我认为没有人会重新发布修复遗漏的手册。

我的打印副本(是的,我确实打印了手册的第 1 卷(ISBN 0-03-061742-1)和第 2 卷(ISBN 0-03-061743-X)的正确装订版本;我得到了他们大约在 1989 年)在 SYNOPSIS 部分有同样的遗漏。

于 2012-04-10T01:33:45.553 回答
0

尝试使用avcall。我自己没用过,只是在这里发现了一个有趣的提法:Passing parameters dynamic to variadic functions

于 2012-04-10T01:38:29.953 回答