如何使用 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++ 中导出变量?的主要内容,如果未能解决你的问题,请参考以下文章