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]
这里的功能是什么。
非常感谢!
答案 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
开头)。