C++ 是否停止库调用getenv?

C++ 是否停止库调用getenv?,c++,environment-variables,C++,Environment Variables,我的程序使用的是一个现有的文档有限的库,对此我没有控制权。就本问题而言,其用途如下: #包括 使用他们的_lib::Node; int main(int argc,字符**argv) { 节点my_节点; //连接到主通信服务器 my_node.init(); // ... } 出于自身最清楚的原因,init()不接受任何参数,而是尝试从环境变量中查找通信服务器的URI(以及其他参数)。我可以通过ltrace看到这一点: ... 15:43:24 libtheirlib.so->gete

我的程序使用的是一个现有的文档有限的库,对此我没有控制权。就本问题而言,其用途如下:

#包括
使用他们的_lib::Node;
int main(int argc,字符**argv)
{
节点my_节点;
//连接到主通信服务器
my_node.init();
// ...
}
出于自身最清楚的原因,
init()
不接受任何参数,而是尝试从环境变量中查找通信服务器的URI(以及其他参数)。我可以通过
ltrace
看到这一点:

...
15:43:24 libtheirlib.so->getenv("THEIRLIB_MASTER_URI") = nil <0.000173>
...
。。。
15:43:24 libtheirlib.so->getenv(“THEIRLIB_MASTER_URI”)=nil
...
现在,我可以用脚本包装我的程序并预先设置环境变量,但是如果我想在运行时更改它们呢?我可以使用
setenv()


我有哪些选项(如果有的话)可以阻止他们的IRLIB使用环境变量来改变其行为,并强制它使用我可以在代码中提供的值?

您的程序将在子shell中运行,因此不会“污染环境”——没有其他进程会看到您的
设置环境(),但是可以插入您自己的
getenv
实现

#define _GNU_SOURCE
#include <dlfcn.h>
#include <string.h>
static char *theirlib_master_uri;
static char *(*real_getenv)(const char *);
char *getenv(const char *name) {
    if (!strcmp(name, "THEIRLIB_MASTER_URI"))
        return theirlib_master_uri;
    if (!real_getenv)
        *((void **)&real_getenv) = dlsym(RTLD_NEXT, "getenv");
    return real_getenv(name);
}
定义GNU源
#包括
#包括
静态字符*theirlib\u主uri;
静态字符*(*real_getenv)(常量字符*);
char*getenv(const char*name){
如果(!strcmp(名称,“THEIRLIB_MASTER_URI”))
返回他们的主uri;
如果(!real_getenv)
*((void**)和real_getenv)=dlsym(RTLD_NEXT,“getenv”);
返回real_getenv(名称);
}

这可以通过
LD_PRELOAD
共享对象或在您自己的程序中完成。

可以使用
LD_PRELOAD
?无,除非重新编译,或者使用非常脏的和特定于平台的链接器技巧……因为您的程序无论如何都将在子shell中运行,因此不会“污染环境”--没有其他人会看到您所做的
setenv()
。如果底层库不准备重新连接到不同的URL,那么环境的改变或其他技巧(除了修改库本身)都不会让它这样做……也许您可以为getenv做一个包装。在这里寻找一些帮助:请注意,它不是真正的子shell,而是过程。每个进程都有自己的一组环境变量。