【问题标题】:execvp argumentsexecvp 参数
【发布时间】:2011-06-08 04:17:11
【问题描述】:

大家好,

我有这个示例代码:

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] 的功能是什么。

非常感谢!

【问题讨论】:

    标签: c unix exec


    【解决方案1】:

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

    【讨论】:

      【解决方案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 开头)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-20
        • 1970-01-01
        • 1970-01-01
        • 2019-06-07
        • 2014-10-23
        • 2013-12-26
        • 2015-11-01
        • 1970-01-01
        相关资源
        最近更新 更多