如何列出 c/c++ 应用程序中的所有环境变量
Posted
技术标签:
【中文标题】如何列出 c/c++ 应用程序中的所有环境变量【英文标题】:How to list all environment variables in a c/c++ app 【发布时间】:2013-05-21 20:38:07 【问题描述】:我知道在使用 c++ 编程时,我可以使用 getenv
访问各个环境变量。
我还知道,在 os x 终端中,我可以使用 env
列出所有当前环境变量。
我有兴趣获得可供我正在运行的 c++ 程序使用的环境变量的完整列表。是否有可以列出它们的 c/c++ 函数?换句话说,有没有办法从我的 c++ 代码中调用env
?
【问题讨论】:
魔法就在这里:env.c. shell 命令是env
,而不是ENV
(我已经编辑了你的问题来解决这个问题)。
【参考方案1】:
您也许可以将不可移植的envp 参数用于main
:
int main(int argc,char* argv[], char** envp)
作为奖励显然是 OSX
你有 apple 它为你提供其他操作系统提供的信息:
int main(int argc, char **argv, char **envp, char **apple)
但它是用来做什么的?好吧,Apple 可以使用 apple 向量将他们想要的任何“隐藏”参数传递给任何程序。他们也确实使用它。目前,apple[0] 包含在磁盘上找到执行二进制文件的路径。你说什么? apple[0] 与 argv[0] 有何不同?不同之处在于调用 execve(2) 时可以将 argv[0] 设置为任意值。例如,shell 通常通过以 argv[0] 中的第一个字符为 -
的方式启动登录 shell,从而将登录 shell 与常规 shell 区分开来
【讨论】:
【参考方案2】:哎呀,我忘了system
可以让你执行终端命令。
这个 sn-p 给了我我需要的东西:
std::cout << "List of environment variables: << std::endl;
system("env");
【讨论】:
这不会使变量对您的程序可用,它只是将它们打印到标准输出。【参考方案3】:使用environ
全局变量。它是一个以空结尾的指针,指向格式为name=value
的字符串数组。这是env
的微型克隆:
#include <stdlib.h>
#include <stdio.h>
extern char **environ;
int main(int argc, char **argv)
for(char **current = environ; *current; current++)
puts(*current);
return EXIT_SUCCESS;
【讨论】:
确实如此。man getenv
在底部(在 OS X 上,OP 提到)有一个 SEE ALSO
部分,其中提到了 environ(7)
。所以man environ
提供了一个手册页来解释这一点。 apropos environment
也包含这个页面。这并不意味着是 RTFM,而是向 OP 暗示手册页的 SEE ALSO
部分值得检查。以上是关于如何列出 c/c++ 应用程序中的所有环境变量的主要内容,如果未能解决你的问题,请参考以下文章
如何列出所有 Linux 环境变量,包括 LD_LIBRARY_PATH