如何列出 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++ 应用程序中的所有环境变量的主要内容,如果未能解决你的问题,请参考以下文章

列出Matlab中的所有环境变量

如何列出所有 Linux 环境变量,包括 LD_LIBRARY_PATH

如何列出 Linux 中的所有 python 虚拟环境? [复制]

JavaScript运行环境和作用域链

设置及查看Linux的环境变量详细教程

怎么查看ubuntu里面的环境变量