【发布时间】:2010-01-18 10:30:29
【问题描述】:
如何获取 C 和/或 C++ 中所有环境变量的列表?
我知道getenv 可以用来读取环境变量,但是如何将它们全部列出呢?
【问题讨论】:
-
使用system(env)调用环境怎么样?
如何获取 C 和/或 C++ 中所有环境变量的列表?
我知道getenv 可以用来读取环境变量,但是如何将它们全部列出呢?
【问题讨论】:
环境变量作为envp 参数提供给main() - 一个以空字符结尾的字符串数组:
int main(int argc, char **argv, char **envp)
{
for (char **env = envp; *env != 0; env++)
{
char *thisEnv = *env;
printf("%s\n", thisEnv);
}
return 0;
}
【讨论】:
#include <stdio.h>
extern char **environ;
int main() {
char **s = environ;
for (; *s; s++) {
printf("%s\n", *s);
}
return 0;
}
【讨论】:
getenv() 不允许遍历所有环境变量,AFAIK。
我认为你应该检查environ。使用“人环境”。
【讨论】:
您的编译器可能会为提供额外环境变量信息的主函数提供非标准扩展。 MS 编译器和大多数 Unix 版本都有这个版本的 main:
int main (int argc, char **argv, char **envp)
其中第三个参数是环境变量信息 - 使用调试器查看格式是什么 - 可能是一个以 null 结尾的字符串指针列表。
【讨论】:
LPTCH WINAPI GetEnvironmentStrings(void);
http://msdn.microsoft.com/en-us/library/ms683187%28VS.85%29.aspx
编辑:仅适用于 Windows。
【讨论】:
int main(int argc, char **argv, char** env) {
while (*env)
printf("%s\n", *env++);
return 0;
}
【讨论】:
int main(int argc, char* argv[], char* envp[]) {
// loop through envp to get all environments as "NAME=val" until you hit NULL.
}
【讨论】:
在大多数环境中,您可以将 main 声明为:
main(int argc,char* argv[], char** envp)
envp 包含所有环境字符串。
【讨论】:
如果您在 Windows 操作系统上运行,那么您也可以调用 GetEnvironmentStrings(),它会返回一个以空字符结尾的字符串块。
【讨论】:
这里的大多数答案都指出了从大多数编译器支持的参数到 main 中选择环境的可能性。而亚历克斯的回答:
#include <stdio.h>
extern char **environ;
int main() {
char **s = environ;
for (; *s; s++) {
printf("%s\n", *s);
}
return 0;
}
应该始终有效,我想知道当您在 C 代码(putenv、unsetenv)中操作环境时,char **environ 会发生什么。然后environ 可能指向其他地方(重新分配时,可能取决于系统实现)。如果我们坚持传递给 main 的参数并将其传递给需要它的函数,则此指针可能不再指向当前环境。
【讨论】:
对我来说,或多或少可移植的 C 代码解决方案如下:
#include <stdlib.h>
void printenv() {
char ** env;
#if defined(WIN) && (_MSC_VER >= 1900)
env = *__p__environ();
#else
extern char ** environ;
env = environ;
#endif
for (env; *env; ++env) {
printf("%s\n", *env);
}
}
解释:
在 Linux、Windows、Solaris、AIX 上成功测试。
也在新版本的 Visual Studio 上成功测试。关键是,至少从 VS 2017(可能更早)开始,environ 全局变量不再被识别。如果你打开头文件 C:\Program Files\Windows Kits\10\Include\x.x.x.x\ucrt\stdlib.h 你会看到这个全局变量被函数__p__environ()替换了。不幸的是,它没有很好地记录。在https://docs.microsoft.com/en-us/cpp/c-runtime-library/environ-wenviron?view=msvc-170 中没有任何消息。
这种方法的优点是,如果不允许修改 main() 函数,添加 envp[] 也是合适的。
关于 GetEnvironmentStrings(),它返回一个空列表。可能它适用于 C++ 而不适用于 C。我没有研究它。
【讨论】: