首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >execvp论点

execvp论点
EN

Stack Overflow用户
提问于 2011-06-08 04:17:11
回答 2查看 21.8K关注 0票数 4

大伙儿,

我有下面的示例代码:

代码语言:javascript
复制
pid = fork();
if (pid == 0) {
   execvp(argv[2],&argv[2]);
   perror("Error");
}else {
wait(NULL);

}  

man exec我了解到

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

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

代码语言:javascript
复制
./a.out 5 ls

命令ls将被执行。

第二个论点呢?手册上说

“指针数组必须以空指针结束”

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

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2011-06-08 04:24:26

execvp的第二个参数是char*的数组,它将成为结果进程的argv。为了让execvp知道这个数组的长度,最后一个"real“元素必须后面跟着NULL,例如,为了将{"foo", "bar"}传递为新的argvexecvp的第二个参数必须引用数组{"foo", "bar", NULL}。在您的示例中,由于传递给程序的argv数组的main已经被自己的NULL条目终止,所以您可以直接将&argv[2]传递给execvp,而不必自己添加NULL

票数 7
EN

Stack Overflow用户

发布于 2011-06-08 04:23:15

当您执行a.out时,它很可能有这样一个main

代码语言:javascript
复制
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开始)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6274166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档