execvp参数

时间:2011-06-08 04:17:11

标签: c unix exec

Helllo所有人,

我有这个示例代码:

pid = fork();
if (pid == 0) {
   execvp(argv[2],&argv[2]);
   perror("Error");
}else {
wait(NULL);

}  

来自man exec我理解

  

“按照惯例,第一个参数应该指向文件名   与正在执行的文件相关联。“

所以,如果我以这种方式执行我的程序:

./a.out 5 ls

将执行命令ls。

第二个论点怎么样?手册说

  

“指针数组必须以NULL指针”

终止

我在这里看不到NULL指针,也没有说明&argv[2]这里的功能是什么。

非常感谢!

2 个答案:

答案 0 :(得分:7)

execvp的第二个参数是char*的数组,它将成为结果进程的argv。为了让execvp知道这个数组有多长,最后一个“真实”元素必须跟NULL后面,例如,为了将{"foo", "bar"}作为新argv传递},execvp的第二个参数必须引用数组{"foo", "bar", NULL}。在您的情况下,由于传递给您的程序argv的{​​{1}}数组已经被其自己的main条目终止,您可以将NULL传递给&argv[2]直接无需自己添加execvp

答案 1 :(得分:2)

当你执行a.out时,它很可能有main这样:

int main(int argc, char *argv[])

/* argv contains this. */
argv[0] == "a.out"
argv[1] == "5"
argv[2] == "ls"
argv[3] == NULL /* Here is your terminator. */

因此,当您将argv[2]传递给execvp时,一切都已就绪,但数组从2开始(以ls开头)。