在 C 中设置环境变量
- 2024-10-30 08:36:00
- admin 原创
- 47
问题描述:
有没有办法使用 C 在 Linux 中设置环境变量?
我尝试过setenv()
和putenv()
,但它们似乎对我不起作用。
解决方案 1:
我在这里做一个大胆的猜测,但这些函数似乎不起作用的正常原因不是因为它们不起作用,而是因为用户并不真正了解环境变量是如何工作的。例如,如果我有这个程序:
int main(int argc, char **argv)
{
putenv("SomeVariable=SomeValue");
return 0;
}
然后我从 shell 运行它,它不会修改 shell 的环境 - 子进程无法做到这一点。这就是为什么修改环境的 shell 命令是内置的,也是为什么您需要source
一个包含要添加到 shell 的变量设置的脚本,而不是简单地运行它。
解决方案 2:
任何 unix 程序都在与启动它的进程不同的进程中运行;这是一个“子”进程。
当程序启动时(无论是通过命令行还是其他方式),系统都会创建一个新进程,该进程(或多或少)是父进程的副本。该副本包括父进程中的环境变量,这是子进程“继承”其父进程的环境变量的机制。(这基本上就是这里的其他答案所说的)
也就是说,进程只设置它自己的环境变量。
其他人提到了获取 shell 脚本,作为在当前进程中设置环境变量的一种方式,但如果您需要以编程方式在当前(shell)进程中设置变量,那么有一种稍微间接的方式是可行的。
考虑一下:
% cat envs.c
#include <stdio.h>
int main(int argc, char**argv)
{
int i;
for (i=1; i<argc; i++) {
printf("ENV%d=%s
", i, argv[i]);
}
}
% echo $ENV1
% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
%
内置函数eval
评估其参数,就像该参数是在 shell 提示符下输入的一样。这是一个 sh 样式的示例;csh 样式的变体留作练习!
解决方案 3:
setenv()/putenv() 设置的环境变量将为执行这些函数的进程设置,并将被其启动的进程继承。但是,它不会被广播到执行程序的 shell 中。
为什么我的 setenv() 包装器不起作用?
解决方案 4:
环境块是进程本地的,并复制到子进程。因此,如果您更改变量,新值只会影响您的进程和更改后生成的子进程。当然,它不会更改您启动的 shell。
解决方案 5:
这不是这个问题的答案,只是想说这putenv
很危险,请setenv
改用。
putenv(char *string)
很危险,因为它所做的只是将键值对字符串的地址附加到 environ
数组中。因此,如果我们随后修改指向的字节string
,则更改将影响进程环境。
#include <stdlib.h>
int main(void) {
char new_env[] = "A=A";
putenv(new_env);
// modifying your `new_env` also modifies the environment
// vairable
new_env[0] = 'B';
return EXIT_SUCCESS;
}
由于environ
仅存储我们参数的地址string
,string
因此必须是静态的以防止悬垂指针。
#include <stdlib.h>
void foo();
int main(void) {
foo();
return EXIT_SUCCESS;
}
void foo() {
char new_env[] = "A=B";
putenv(new_env);
}
当函数的堆栈框架foo
被释放时,的字节new_env
就消失了,并且存储在的地址environ
变成了悬垂指针。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件