【问题标题】:Why is execve ignoring environment arguments?为什么 execve 忽略环境参数?
【发布时间】:2014-07-08 02:41:21
【问题描述】:

假设我们有 program1:

int main(void) {
    char *env[2];

    env[0] = "PATH=/";
    env[1] = NULL;

    execve("/program2", NULL, env);

    exit(0);
}

我们还有program2:

int main(void) {
    exit(0);
}

对此进行调试,PATH 实际上并没有在执行的新进程(program2)中被修改。

【问题讨论】:

  • 除了您没有遵循警告,您不应将NULL 作为第二个参数传递给exec*() 系列的函数,而是一个NULL 终止的指向@ 的数组987654327@(就像env),代码没问题,在这里工作。
  • 您知道execve() 是否有效吗?你的第一个程序最后应该有return(1);exit(1);,并在execve() 返回时打印一个诊断信息(如果它返回,你就知道它失败了)。你会不会做得更好/usr/bin/env 这样你才能看到新进程的环境?
  • execve() 绝对有效。我不完全确定 env 在这里为我做了什么(或如何在 C 中使用它),但请注意我无权访问第二个程序。
  • program1 中,您的代码尝试执行 program2,它应该位于文件系统树的根目录 ("/program2"在您的代码中)。你为什么要把那个程序放在那里?您是否希望 program1 像您一样通过更新 PATH 环境变量来认为 program2 存在?

标签: c path environment-variables


【解决方案1】:

调试这个,PATH实际上并没有在新进程中修改 (program2) 被执行。

这不是真的。注意p environ不起作用,而x 0x8049650(地址environ@@GLIBC_2.0,从info var environ获得)起作用:

(gdb) p 环境 $1 = (char **) 0x0 (gdb) p/x &environ $2 = 0xf7fbfd44 (gdb) x 0x8049650 0x8049650:0xffffdf18 (gdb) x/s **0x8049650 0xffffdfe8:“路径=/”

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2020-03-29
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多