在C中获取系统环境变量

时间:2013-06-20 18:03:50

标签: c environment-variables setenv getenv

我在C中编写了一个应用程序,它应该是读取环境变量并适当地处理这些更改。当应用程序启动时,我已将其设置为继续并通过setenv("MYVARIABLE", "TEST", 1)初始化变量(以防止返回任何空指针)。

此应用程序经常循环,并且在这些循环期间,其中一项工作是通过getenv("MYVARIABLE")检查全局变量。

然后计划是让shell脚本或python脚本更改这些环境变量。 C应用程序是全屏的,所以我无法在没有其他终端条目的情况下测试此过程。在我的另一个终端( c2 )中,我运行如下命令:

MYVARIABLE="My New Value"

export MYVARIABLE="My New Value"

我的应用程序似乎没有抓住环境更新。相反,它继续坚持认为MYVARIABLE是“测试”,而不是“我的新价值”。我不确定为什么这两个环境是分开的,但我需要它们一起工作。有谁知道我做错了什么?

我的系统正在为感兴趣的人

运行Archlinux

2 个答案:

答案 0 :(得分:1)

您现在面临的问题是您只在本地shell会话的范围内设置变量。 EX:

(假设bash)设置变量如:

MYVARIABLE="My New Value"

当你将它设置为:

时,它只会影响当前的shell
export MYVARIABLE="My New Value"

它影响当前shell,并且所有进程都从当前shell启动。

如果您在.bashrc文件中设置它,它将为所有将来的会话永久设置它,但您需要获取该文件才能在当前会话中使用。


最好的解决方案是分叉流程。例如,如果您的程序被调用a.out,则可以执行:

> ./a.out &

这将允许您在程序运行时继续在shell会话中工作,然后您可以在同一会话中设置变量。


我见过的唯一另一个选择是强制你的shell会话在他们进来时“自动”提供源代码:

1)在第一个会话中输入:

trap 'source ~/.bashrc' DEBUG

2)然后在同一个会话中启动你的程序:

./a.out

3)在第二个窗口中编辑.bashrc文件以添加新的env var

4)在第二个窗口中获取文件的新版本:

source ~/.bashrc

现在,运行程序的第一个窗口将新的var设置为其会话。我之前使用过,我知道它有效,但我从来没有尝试过已经生成的应用程序..但我怀疑它应该适合你。

答案 1 :(得分:0)

您的流程环境无法动态更改!!!

记住这个main()原型......

int main (int argc, char *argv[], char *envp[])
{
    char *path;

    /*
    Searches in this process envp[] only,
    There is no way it can access changes happening in Shell command prompt...
    User shell does not communicate with this process, if not piped.
    This will always return PATH, that was set at the time of starting.
    */
    while (1)
    {
        path = getenv("PATH");
        sleep (5);
        printf("PATH = %s\n", path);
        free(path);
    };
}

您对getenv()库函数的理解是错误的。为了达到您的期望,您需要使用任何形式的IPC。

setenv()适用于调用进程自己的环境。这将通过fork(),exec()系统调用传递给它自己的子进程。这将不会在父进程中执行任何操作,即shell。