【问题标题】:Get System Environmental Variables In C在 C 中获取系统环境变量
【发布时间】:2013-06-17 17:21:12
【问题描述】:

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

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

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

MYVARIABLE="My New Value"

export MYVARIABLE="My New Value"

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

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

【问题讨论】:

  • 这些是不同的,因为您运行两个不同的 shell 实例。
  • H2CO3 那么是否可以为主shell设置环境变量呢?
  • 我在谷歌搜索(你也可能在谷歌搜索)。
  • 如果您在另一个终端窗口中设置新变量,它是在另一个会话中,为什么不使用&(即./a.out &)启动您的程序,这样您就可以在同一个会话?
  • Mike,该程序实际上是一个桌面管理器。 UI 是占据屏幕的部分。 getenv("MYVARIABLE") 的结果应该显示在屏幕上。在我在桌面管理器中配置终端支持之前,我将无法执行此类操作。

标签: c environment-variables setenv getenv


【解决方案1】:

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

(假设 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 文件以添加新的环境变量

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

source ~/.bashrc

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

【讨论】:

    【解决方案2】:

    您的流程环境不是动态变化的!!!

    记住这个 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-29
      • 2016-07-03
      • 2020-06-23
      • 1970-01-01
      • 2011-01-17
      • 2015-03-16
      • 1970-01-01
      • 2013-11-11
      相关资源
      最近更新 更多