在C中设置环境变量

时间:2010-08-05 15:57:26

标签: c linux unix environment-variables

有没有办法在Linux中使用C设置环境变量?

我尝试了setenv()putenv(),但它们似乎并不适合我。

4 个答案:

答案 0 :(得分:47)

我将在这里做一个疯狂的猜测,但这些函数似乎不起作用的正常原因不是因为它们不起作用,而是因为用户并不真正了解环境变量的工作原理。例如,如果我有这个程序:

int main(int argc, char **argv)
{
  putenv("SomeVariable=SomeValue");
  return 0;
}

然后我从shell运行它,它不会修改shell的环境 - 子进程无法做到这一点。这就是为什么修改环境的shell命令是内置的,以及为什么需要source包含要添加到shell的变量设置的脚本,而不是简单地运行它。

答案 1 :(得分:10)

任何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\n", i, argv[i]);
    }
}
% echo $ENV1

% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
% 

内置eval计算其参数,就好像在shell提示符下键入了该参数一样。这是一个sh风格的例子; csh风格的变体留作练习!

答案 2 :(得分:5)

由setenv()/ putenv()设置的环境变量将为执行这些功能的进程设置,并将由其启动的进程继承。但是,它不会被广播到执行程序的shell中。

Why isn't my wrapper around setenv() working?

答案 3 :(得分:1)

环境块是进程本地的,并复制到子进程。因此,如果更改变量,则新值仅会影响更改后生成的进程和子进程。确保它不会改变你发起的shell。