[英]Printing all environment variables in C / C++
如何获取 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;
}
我认为你应该检查environ
。 使用“人环境”。
您的编译器可能会为提供额外环境变量信息的 main 函数提供非标准扩展。 MS 编译器和大多数 Unix 版本都有这个版本的 main:
int main (int argc, char **argv, char **envp)
其中第三个参数是环境变量信息 - 使用调试器查看格式是什么 - 可能是字符串指针的空终止列表。
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()
返回一个空终止字符串块。
或多或少的可移植 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
全局变量不再被识别。 如果您打开 header C:\Program Files\Windows Kits\10\Include\xxxx\ucrt\stdlib.h,您将看到此全局变量已替换为 function __p__environ()
。 不幸的是,它没有很好的记录。 在https://learn.microsoft.com/en-us/cpp/c-runtime-library/environ-wenviron?view=msvc-170中没有关于它的消息。
这种方法的优点是,如果您不允许修改 main() function 添加envp[]
,它也是合适的。
关于 GetEnvironmentStrings(),它返回一个空列表。 可能它适用于 C++ 而不是 C。我没有调查它。
这里的大多数答案都指出了从大多数编译器支持的 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
时char **environ
会发生什么。 然后environ
可能指向其他地方(重新分配时,可能取决于系统实现)。 如果我们坚持传递给 main 的参数并将其传递给需要它的函数,则此指针可能不再指向当前环境。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.