使用 c 语言的 setenv 函数访问环境变量
本文将介绍在 c 语言中使用 setenv
函数导出环境变量的几种方法。
在 c 语言中使用 setenv
函数导出环境变量
在 unix-base 系统上运行的每个程序都有一个环境,它收集了主要由 shell 和其他用户空间程序使用的变量值对。程序可以用 getenv
函数检索单个环境变量及其值。但如果要定义一个新的变量或改变现有的变量,则应调用 setenv
函数。它需要三个参数,第一个和第二个参数是 char
指针,分别指向变量名和它的值。第三个参数的类型是 int
,它指定如果环境中已经存在给定变量的值是否应该被覆盖。这个参数的非零值表示覆盖行为,零值表示相反。
但请注意,遍历所有定义的环境变量,需要访问名为-environ
的特殊全局变量,它是一个以 null 结尾的字符串数组。另外,也可以声明 main
函数,第三个参数 envp
来访问变量。在下面的例子中,我们在调用 setenv
函数之前和之后同时打印 eniron
和 envp
指针。请注意,调用后,envp
指针的值是一样的,而 environ
的值已经改变了。
#include #include extern char **environ;
int main(int argc, const char *argv[], const char *envp[]) {
printf("environ: %p\n", environ);
printf("envp: %p\n", envp);
setenv("new_var", "new_value", 1);
puts("----added new_var----");
printf("environ: %p\n", environ);
printf("envp: %p\n", envp);
exit(exit_success);
}
输出:
environ: 0x7fffa05a7fe8
envp: 0x7fffa05a7fe8
----added new_var----
environ: 0x5646431276b0
envp: 0x7fffa05a7fe8
使用 envp
变量在 c 语言中遍历定义的环境变量
前面的代码例子说明了为什么应该避免在调用 setenv
函数后使用 main
函数参数 envp
检索环境变量。当调用 setenv
函数时,环境被重新定位,但 envp
仍然指向旧环境。下面的示例代码通过用 setenv
调用定义一个新的变量,然后遍历 envp
指针数组来演示错误的行为。请注意,如果找到名为 new_var
的变量,我们还利用 goto
语句跳转到循环的末端。
#include #include #include int main(int argc, const char *argv[], const char *envp[]) {
if (setenv("new_var", "new_value", 1) != 0) {
perror("setenv");
exit(exit_failure);
}
if (envp != null) {
for (size_t i = 0; envp[i] != null; i) {
if (strcmp(envp[i], "new_var=new_value") == 0) {
puts(envp[i]);
goto end;
}
}
printf("no such variable found!\n");
} end:
exit(exit_success);
}
输出:
no such variable found!
使用 environ
变量在 c 语言中遍历定义的环境变量
由于前面的ag捕鱼王app官网的解决方案找不到新定义的变量,我们应该使用外部声明的 environ
变量。在这种情况下,我们包含了多个预处理器条件语句,以使代码在不同的系统中可移植,但在大多数基于 unix 的系统中只需要 extern char **environ
。一旦声明,我们就可以使用我们在上一个例子中实现的相同的循环来遍历变量列表。
#include #include #include #if defined (_posix_) || defined (__use_posix)
extern char **environ;
#elif defined(_win32)
_crtimp extern char **_environ;
#endif
int main(void) {
if (setenv("new_var", "new_value", 1) != 0) {
perror("setenv");
exit(exit_failure);
}
if (environ != null) {
for (size_t i = 0; environ[i] != null; i) {
if (strcmp(environ[i], "new_var=new_value") == 0) {
puts(environ[i]);
goto end;
}
}
printf("no such variable found!\n");
} end:
exit(exit_success);
}
输出:
new_var=new_value
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
在c中将整数转换为字符
发布时间:2024/01/03 浏览次数:131 分类:c语言
-
本教程介绍了在c中将整数转换为字符的不同方法。在c编程语言中,将整数转换为字符在各种情况下都很重要。在c中,字符是以ascii值表示的,因此转换过程相对简单。
发布时间:2023/05/07 浏览次数:364 分类:c语言
-
本文介绍了如何在 c 语言中使用 typedef enum。使用 enum 在 c 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
发布时间:2023/05/07 浏览次数:129 分类:c语言
-
本文演示了如何在 c 语言中使用前缀增量与后缀增量运算符。c 语言中 i 和 i 记号的主要区别
发布时间:2023/05/07 浏览次数:275 分类:c语言
-
本文演示了如何在 c 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法
发布时间:2023/05/07 浏览次数:177 分类:c语言
-
本文介绍了如何在 c 语言中使用位掩码。使用 struct 关键字在 c 语言中定义位掩码数据
发布时间:2023/05/07 浏览次数:212 分类:c语言
-
本文演示了如何在 c 语言中使用标准库排序函数。使用 qsort 函数对 c 语言中的整数数组进行排序
c 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:131 分类:c语言
-
本文介绍了如何在 c 语言中使用 extern 关键字。c 语言中使用 extern 关键字来声明一个在其他文件中定义的变量