当我调用execvp
时,例如execvp(echo, b)
,其中b是命令a的参数数组,稍后更改此数组是否会影响先前执行的execvp调用?当我尝试调用execp(echo,b)时,它最终打印出来(null)而不是b中的内容。任何人都可以指出为什么以及我必须做些什么来正确传递参数?
答案 0 :(得分:12)
在您致电exec()
或其亲属后,您的原始程序不再存在。这意味着该程序中的任何内容都不会影响exec()
调用后的任何内容,因为它永远不会运行。也许你没有正确构建你的参数数组?以下是execvp()
的快速工作示例:
#include <unistd.h>
int main(void)
{
char *execArgs[] = { "echo", "Hello, World!", NULL };
execvp("echo", execArgs);
return 0;
}
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
使用起来会更舒服,您可以根据需要传递任意数量的参数。