0

我用 C 语言编写了一个应用程序,它应该读取环境变量并适当地处理这些更改。当应用程序启动时,我已将其设置为继续并通过setenv("MYVARIABLE", "TEST", 1).

此应用程序经常循环,并且在这些循环期间,它的工作之一是通过getenv("MYVARIABLE").

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

MYVARIABLE="My New Value"

或者

export MYVARIABLE="My New Value"

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

我的系统正在为任何感兴趣的人运行 Archlinux

4

2 回答 2

1

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

(假设 bash)当您设置变量时,例如:

MYVARIABLE="My New Value"

当您将其设置为:

export MYVARIABLE="My New Value"

它影响当前 shell 和从当前 shell 启动的所有进程。

如果您在 .bashrc 文件中设置它,它将为所有未来会话永久设置它,但您需要获取该文件以使其在当前会话中工作。


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

> ./a.out &

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


我见过的唯一其他选择是强制您的 shell 会话在它们进入时“自动”获取它们:

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

trap 'source ~/.bashrc' DEBUG

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

./a.out

3)在第二个窗口中编辑您的.bashrc文件以添加新的环境变量

4) 在第二个窗口 source 新版本的文件:

source ~/.bashrc

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

于 2013-06-20T18:24:57.333 回答
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)中执行任何操作。

于 2013-06-21T00:33:28.857 回答