6

当我调用execvp时,例如execvp(echo, b)其中 b 是命令 a 的参数数组,稍后更改此数组会影响之前进行的 execvp 调用吗?当我尝试调用 execp(echo, b) 时,它最终打印出 (null) 而不是 b 内的内容。谁能指出正确传递论点的原因以及我必须做些什么?

4

2 回答 2

12

在您致电exec()或其中一个亲戚之后,您的原始程序将不复存在。这意味着该程序中的任何内容都不会影响exec()调用后的任何内容,因为它永远不会运行。也许您没有正确构建参数数组?这是一个快速工作示例execvp()

#include <unistd.h>

int main(void)
{
  char *execArgs[] = { "echo", "Hello, World!", NULL };
  execvp("echo", execArgs);

  return 0;
}

execvp()手册页

、和函数提供指向以空字符结尾的字符串的指针数组execv(),这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。指针数组必须由指针终止。execvp()execvpe()NULL

一个常见的错误是跳过关于“第一个参数,按照惯例,应该指向与正在执行的文件关联的文件名”的部分。那是确保echo“回声”作为的部分argv[0],这可能取决于它。

于 2012-01-11T22:58:17.567 回答
0

请记住,exec调用后您的程序会被一个新程序交换。它不再执行,因此exec调用后同一进程中的任何代码实际上都无法访问。

您确定 b 数组以 NULL 终止吗?最后一个元素必须为 NULL 才能使 exec 正常工作。另外,请记住将您的第一个参数也设置为“echo”(它是 argv[0])。

尝试

execlp("echo", "echo", "something", NULL);

顺便说一句,execlp使用起来更舒服一些,您可以传递任意数量的参数。

于 2012-01-11T22:57:29.830 回答