处理execvp的参数数组?

时间:2012-01-11 22:54:51

标签: c exec execvp

当我调用execvp时,例如execvp(echo, b),其中b是命令a的参数数组,稍后更改此数组是否会影响先前执行的execvp调用?当我尝试调用execp(echo,b)时,它最终打印出来(null)而不是b中的内容。任何人都可以指出为什么以及我必须做些什么来正确传递参数?

2 个答案:

答案 0 :(得分:12)

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

#include <unistd.h>

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

  return 0;
}

来自execvp() man page

  

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

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

答案 1 :(得分:0)

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

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

尝试

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

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