如何使用 setenv() 在 C++ 中导出变量?

Posted

技术标签:

【中文标题】如何使用 setenv() 在 C++ 中导出变量?【英文标题】:How to use setenv() to export a variable in c++? 【发布时间】:2013-07-29 16:37:04 【问题描述】:

我需要导出几个变量,使它们在命令行中如下所示

export ROS_HOSTNAME=xxx

如何在 c++ 中使用 setenv() 来实现?

谢谢。

【问题讨论】:

您在问题的上下文中提到command-line标签的原因是什么?您需要在哪里'export'?请详细说明! 这些环境变量需要在什么上下文中可见?如果它们只需要在调用setenv 的程序中可见,就可以了。如果您在运行程序后需要它们在 在您的 shell 中可见,请这样说;有(间接)方法可以做到这一点,但除非你问,否则我不会回答这个问题。 “导出”是一个 shell 功能setenv() 始终“导出”environ/envp,除非分叉的孩子传递了自定义的envp,即execle() 【参考方案1】:

来自setenv() 手动输入:

概要

#include <stdlib.h>  
int setenv(const char *envname, const char *envval, int overwrite);

描述 setenv() 函数应在调用进程的环境中更新或添加变量。 envname 参数指向一个包含环境变量名称的字符串 被添加或更改。环境变量应设置为 envval 指向的值。如果 envname 指向包含“=”字符的字符串,则该函数将失败。如果 以 envname 命名的环境变量已经存在且 overwrite 的值非零,函数应返回成功并更新环境。如果环境 envname 命名的变量已经存在,overwrite 的值为零,函数返回成功,环境保持不变。

如果应用程序修改了 environ 或其指向的指针,则 setenv() 的行为未定义。 setenv() 函数将更新指向哪个环境的指针列表 点。

由 envname 和 envval 描述的字符串被这个函数复制。

setenv() 函数不需要是可重入的。不需要可重入的函数不需要是线程安全的。

返回值 成功完成后,归零。否则返回-1,设置errno表示错误,环境不变。

所以你应该打电话给

setenv("ROS_HOSTNAME","xxx",1); // does overwrite

setenv("ROS_HOSTNAME","xxx",0); // does not overwrite

针对您的情况。取决于,如果你想覆盖一个可能存在的定义。

注意:

您不能使用setenv() 将变量从您的进程导出到调用进程(shell)! 使用 fork 创建的子进程将继承当前进程环境定义,因此您的更改和添加也将继承。

【讨论】:

【参考方案2】:

这里是 setenv 函数的签名

#include <stdlib.h>

int setenv(const char *envname, const char *envval, int overwrite);

链接:http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html

在你的情况下,你这样称呼它:

setenv("ROS_HOSTNAME", "xxx", true);

最后一个布尔参数表示如果环境变量的值已经存在,是否要覆盖它。

【讨论】:

【参考方案3】:

这样做

setenv("ROS_HOSTNAME", "xxx", true);

请注意它的概要:

#include <stdlib.h>

int setenv(const char *envname, const char *envval, int overwrite);

有关setenv() 的更多详细信息,请参阅this link

【讨论】:

以上是关于如何使用 setenv() 在 C++ 中导出变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Ant 'exec' 任务中导出环境变量?

如何要求在 ES6 模块中导出的常量?

在 DLL 中导出的 C++ 函数中使用 #ifdef 块

在一个 reducer 文件 REDUX 中导出多个变量

如何在 TypeScript npm 模块中导出类型

Tensorflow 在 C++ 中导出和运行图的不同方法