【问题标题】:Execve() adds two extra argumentsExecve() 添加了两个额外的参数
【发布时间】:2020-08-06 18:39:18
【问题描述】:

当我编译以下代码并在其上运行strace 时,我可以看到它在args[] 数组中添加了两个额外的元素。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char *args[2];
    args[0] = "/bin/ls";
    args[1] = "-lh";
    execve(args[0], args, NULL);

    return 1;
}

strace 表示这是实际调用的内容:

execve("/bin/ls", ["/bin/ls", "-lh", "\340\301\361\267", "\1"], NULL)

【问题讨论】:

  • args[2]; 替换为args[3]; 并添加args[2] = NULL;

标签: c strace execve


【解决方案1】:

您需要在参数数组的最后一个元素中添加一个空 ptr。否则 execve 不知道你的数组在哪里结束。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char *args[3];
    args[0] = "/bin/ls";
    args[1] = "-lh";
    args[2] = NULL;
    execve(args[0], args, NULL);

    return 1;
}

所以基本上你看到的是 execv 传递随机参数,直到它在你用数组指向的内存中找到一个 NULL。当然它也可能会崩溃。

【讨论】:

  • 是的,结果证明 main() 中的 argc 对于以 argv 结尾的空指针是多余的,但对新手更友好!
  • 我不认为是多余的,因为(如果我没记错的话) argv 不保证在每个平台上都以空 ptr 结尾,甚至不是空本身。
  • @pablo:你的记忆有问题。 ISO-C,第 5.1.2.2.1 节第 2 段,强调添加:“如果声明它们,main 函数的参数应遵守以下约束: — argc 的值应为非负值。 — argv[argc] 应为空指针。"
  • @David 很高兴知道!非常感谢您的澄清。
  • V6 中,argv[argc] 为 -1。 Earlier documentation 甚至没有提到 -1,并且程序应该使用 argc。从V7 开始,argv[argc] 为 0(标准中为 NULL)。
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 2012-11-16
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多