大伙儿,
我有下面的示例代码:
pid = fork();
if (pid == 0) {
execvp(argv[2],&argv[2]);
perror("Error");
}else {
wait(NULL);
} 从man exec我了解到
“按照约定,第一个参数应该指向与正在执行的文件相关联的文件名”。
所以,如果我以这种方式执行我的程序:
./a.out 5 ls命令ls将被执行。
第二个论点呢?手册上说
“指针数组必须以空指针结束”
我在这里没有看到空指针,我也不知道&argv[2]的功能是什么。
非常感谢!
发布于 2011-06-08 04:24:26
execvp的第二个参数是char*的数组,它将成为结果进程的argv。为了让execvp知道这个数组的长度,最后一个"real“元素必须后面跟着NULL,例如,为了将{"foo", "bar"}传递为新的argv,execvp的第二个参数必须引用数组{"foo", "bar", NULL}。在您的示例中,由于传递给程序的argv数组的main已经被自己的NULL条目终止,所以您可以直接将&argv[2]传递给execvp,而不必自己添加NULL。
发布于 2011-06-08 04:23:15
当您执行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开始)。
https://stackoverflow.com/questions/6274166
复制相似问题