c++ - tcl 文件无法获取通过代码设置的环境变量

标签 c++ linux windows tcl xilinx

我已经使用 putenv 通过我的代码设置了环境变量。我正在通过 tcl 文件读取环境变量。看来,在Windows中这显示了以下内容 错误:无法读取“env(myvar)”:没有这样的变量, 没有这样的变量 (读取“env(myvar)”上的跟踪) 从内部调用 “放置 $env(myar)”

但在 Linux 中,错误不会出现。

putenv用于设置环境变量 $env() 在 tcl 文件中用于获取 env。

最佳答案

这是已知的,并且是由于以下事实引起的:如果我们更精确地同步,则从 Tcl 对环境变量的所有访问都会产生更大的性能损失,并且这是比从 C 代码更改环境变量的情况更常见的用例。 (putenv() 系统调用没有给我们任何可以有效地 Hook 来检测更改的内容,因此我们最终不得不从头开始重新组装整个 env 数组;这被发现是一个重要的瓶颈。)

最简单的解决方法是在 Tcl 中创建一个额外的命令(但用 C 编写),直接包装 getenv() 调用,以便您可以将其与您怀疑可能已在 Tcl 背后更改的环境变量一起使用。

int WrapGetEnv(ClientData ignored, Tcl_Interp *interp, int argc, char *argv[]) {
    if (argc != 2) {
        // Probably ought to be a better error here
        return TCL_ERROR;
    }
    char *var = argv[1];
    char *val = getenv(var);
    if (val != NULL) {
        Tcl_SetResult(interp, val, TCL_DYNAMIC);
    }
    return TCL_OK;
}

// ... in the right place do this ...
Tcl_CreateCommand(interp, "getenv", WrapGetEnv, NULL, NULL);

关于c++ - tcl 文件无法获取通过代码设置的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55335551/

相关文章:

c++ - 仅 header 库中的静态数据

linux - 在 Debian : could not find library containing RSA_new 上构建 Subversion 1.5.4

java - 没有 USB 设备识别 libusbJava/ubuntu 13.04

java - 如何在 Linux 上运行扩展名为 .exe 的 Windows Java 可执行文件

c++ - 循环绘制特定坐标

c++ - 弗莱施程序 C++

c++ - 使用单个模板的两种类型的构造函数?

linux - 无法让 Terminus 与 PHPStorm 一起工作

windows - Windows 任务管理器和任务列表中显示不同的内存使用情况

windows - RNDIS 小工具无法启动