【问题标题】:execve not taking environment parametersexecve 不采用环境参数
【发布时间】:2016-02-09 11:50:40
【问题描述】:

我想编写一个执行 Linux ls 命令的程序。 我真的只想输入ls 而不是/bin/ls,所以我想用execve 来做这个(execvp 不是一个选项)。

我试过了:

char *env[] = { "SHELL=/bin/bash",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games",
"_=/usr/bin/env",
(char *)0 };
execve(parmList[0], parmList, env);

但它似乎不起作用,ls 未被识别,但 /bin/ls 被识别。 parmList 没有任何问题,因为我用 execvp 尝试过这个,它成功了。

有什么想法吗?

【问题讨论】:

  • 1) 为什么execvp 不是一个选项? 2)你查过execvp/execvpeexecv/execve之间的区别吗?
  • 请给出完整的数据。 parmList 是如何声明/填充的?结果是什么(perror,返回值……)?
  • 1) 因为我希望有一天可以说:我使用程序“abc”,例如“/home/user/programs”每天,我不想每次都输入完整路径。然后应该可以简单地添加另一个数组条目。 2) execvpe 似乎可以工作,但我的编译器出于任何原因不喜欢它。
  • 编译器在哪些方面不喜欢它?它是否抱怨它没有被宣布?如果该功能有效,则可能意味着链接器找到了它。您可能需要指定-std=gnu11 而不是-std=c11,或者您可能需要使用#define _GNU_SOURCE 才能使execvpe() 的声明可见。

标签: c linux environment-variables execve


【解决方案1】:

如果parmList[0] 仅包含ls,则execve() 将找不到ls 命令,除非它位于当前目录中。

对于execve(),环境中PATH 的值是无关紧要的——execve() 不使用它。您可以使用execvp()(或execvpe(),如果可用)在当前进程的PATH 上执行命令。

【讨论】:

  • 非物质是什么意思?
  • 我的意思是,对于execve(),PATH 的值是什么并不重要,因为execve() 不会使用它。如果您使用execvp(),这将很重要。 (从 Linux 或 OpenBSD 的 execvpe() 手册中并不清楚使用了哪个 PATH 值;envp 参数中设置的那个值或现行值。)
  • 好吧...所以没有机会实现这个行为:程序 abc 位于 /home/user/somedir。我将数组中的 /home/user/somedir 设置为环境参数。如果我现在输入 ./abc,即使我不在目录 /home/user/somedir 中也会找到它?
  • 没有。如果parmList[0] 包含./abc,那么exec 的任何变体将运行的唯一程序将是当前目录中的程序。如果第一个参数中的名称不包含斜杠,则名称中带有 pexec 的变体仅在 PATH 上查找。任何斜线表示它只能通过该确切名称找到。如果abc/home/user/somedir 中并且/home/user/somedir 是PATH 中的目录列表之一,并且如果您的parmList[0] 仅包含abc,则execvp()execlp()(或execvpe())会找到/home/user/somedir 中的程序。 [...注意事项...]
  • […caveats…] 只要 PATH 中列出的目录中的其他位置没有其他程序 abc/home/user/somedir 中的 abc 就会被执行在/home/user/somedir 之前。请注意,POSIX 没有定义 execvpe(),但它在 Linux(您正在使用的)和 OpenBSD(但不是一些其他 BSD 变体——特别是 Mac OS X 没有execvpe())上都可用。因此,您可以使用execvpe() 或多或少地做您想做的事。唯一的遗留问题是execvpe() 是使用envpPATH 的值还是进程环境中的值。它可以使用任何一个。
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多